2017-07-28 99 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