2017-07-28 98 views
1

因此,显然,根据我的教授,除了一列显示下面代码中显示的列的排名外,我拥有一切权利。我在想,基本上,它只需要将行号显示在其自己列的左侧。下面是说明:SQL Server - 如何将RANK函数插入已按排序顺序排序的行?

销售经理现在想你创建通过总销售额和总销售数量两列她 产品的报告(每次都会 是自己的列)。创建一个存储过程,返回以下列的 ,但也添加了两个新的等级列。

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

我知道它在分配描述中没有额外的列,但我想我需要它。以下是我迄今为止:

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 

更新:它需要在存​​储过程和热膨胀系数可以/应该使用。我可以在CTE上使用一些帮助。这对我来说很难。

回答

1

这仅仅是一个存储过程的选择一部分,但它应该告诉你该怎么做:

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 

注意这里的几件事情。此代码可以剪切并粘贴到Management Studio查询窗口中并按照这种方式运行。它从一些表格声明开始并插入示例数据。当问一个问题时,如果你做这部分工作总是有用的;人们更可能回答,如果最无聊的一点就完成了!

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

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

HTH