Sql server SQL Server-如何向已按排序顺序排序的行插入秩函数?

Sql server SQL Server-如何向已按排序顺序排序的行插入秩函数?,sql-server,stored-procedures,window-functions,rank,Sql Server,Stored Procedures,Window Functions,Rank,所以,很明显,根据我的教授,我所有的东西都是对的,除了一列显示了下面代码中列的排名。我认为,本质上,它只需要在自己的列中显示左侧的行号。以下是说明: 销售经理现在希望您创建一份对她进行排名的报告 按总销售额和总销售数量列出的产品(每个将 是它自己的专栏)。创建一个存储过程,返回 以下列,但也添加了两个新列 产品名称|订单数|总销售额|总销售额 数量 我知道它在作业描述中没有那个额外的列,但我想我需要它。以下是我到目前为止的情况: USE OnlineStore GO CREATE PROC s

所以,很明显,根据我的教授,我所有的东西都是对的,除了一列显示了下面代码中列的排名。我认为,本质上,它只需要在自己的列中显示左侧的行号。以下是说明:

销售经理现在希望您创建一份对她进行排名的报告 按总销售额和总销售数量列出的产品(每个将 是它自己的专栏)。创建一个存储过程,返回 以下列,但也添加了两个新列

产品名称|订单数|总销售额|总销售额 数量

我知道它在作业描述中没有那个额外的列,但我想我需要它。以下是我到目前为止的情况:

USE OnlineStore
GO

CREATE PROC spManagerProductSalesCount
AS
BEGIN
SELECT 
    P.Name AS 'Product Name',
    Isnull(Count(DISTINCT O.OrderID), 0) AS 'Orders Count',
    Sum(Isnull(O.OrderTotal, 0)) AS 'Total Sales Value',
    Sum (Isnull(OI.OrderItemQuantity, 0)) AS 'Total Sales Quantity'
FROM 
    Product P
INNER JOIN 
    OrderItem OI ON P.ProductID = OI.ProductID
INNER JOIN 
    Orders O on O.OrderID = OI.OrderID
GROUP BY
    P.Name
ORDER BY
    'Total Sales Value' DESC, 'Total Sales Quantity' DESC
END

更新:它确实需要在存储过程中,并且可以/应该使用CTEs。我需要一些CTE方面的帮助。这些对我来说相当困难。

这只是存储过程中的选择部分,但它应该告诉您要做什么:

declare @products table
(
Name varchar(50),
id int
)
declare @orderitems table
(
id int,
orderid int,
productid int,
orderitemquantity int
)
declare @orders table
(
orderid int,
ordertotal decimal(18,2)
)

insert into @products VALUES ('apple', 1)
insert into @products VALUES ('orange', 2)
insert into @products VALUES ('pear', 3)
insert into @products VALUES ('melon', 4)

insert into @orders values(1, 19.0)
insert into @orders values(2, 25.5)
insert into @orders values(3, 9.5)
insert into @orders values(4, 13.5)
insert into @orders values(5, 8.5)

insert into @orderitems VALUES(1, 1, 1, 20)
insert into @orderitems VALUES(2, 1, 2, 10)
insert into @orderitems VALUES(3, 2, 3, 5)
insert into @orderitems VALUES(4, 2, 4, 4)
insert into @orderitems VALUES(5, 3, 1, 10)
insert into @orderitems VALUES(6, 3, 2, 5)
insert into @orderitems VALUES(7, 4, 3, 3)
insert into @orderitems VALUES(8, 4, 4, 2)
insert into @orderitems VALUES(9, 5, 1, 5)
insert into @orderitems VALUES(10, 5, 4, 2)

;WITH summary as 
(
    SELECT p.Name as ProductName, 
    COUNT(o.orderid) as 'Orders Count',
    ISNULL(Sum(o.ordertotal),0) AS 'Total Sales Value',
    ISNULL(Sum(oi.orderitemquantity),0) AS 'Total Sales Quantity'
    FROM @products p
    INNER JOIN @orderitems oi on oi.productid = p.id
    INNER JOIN @orders o on o.orderid = oi.orderid 
    GROUP BY p.Name
)

SELECT ProductName, [Orders Count], [Total Sales Value], [Total Sales Quantity], 
RANK() OVER (ORDER BY [Total Sales Value] DESC) AS ValueRanking,
RANK() OVER (ORDER BY [Total Sales Quantity] DESC) AS QuantityRanking FROM summary
注意这里的一些事情。此代码可以剪切并粘贴到ManagementStudio查询窗口中,并按此方式运行。它从一些表声明和插入示例数据开始。当你问一个问题的时候,如果你做这部分的工作,它总是有用的;如果做了最无聊的一点,人们更有可能回答

COUNT()不需要ISNULL保护;如果没有值,则返回0

给出最终的数据,你会发现ValueRanking和QuantityKings是不同的(我通过修改数据得到了这一点,只是为了说明这一点)。这意味着最终结果只能由其中一个列排序(或者实际上由任何其他列排序-排序依据不依赖于排名)