SQL Server求解最近多少銷售記錄的銷售額占比總銷售額的指定比例


看園中SQL Server大V瀟瀟隱者的博文,發現一邊文就是描述了如標題描述的問題

 
具體的問題描述我通過瀟瀟隱者的博文的截圖來闡釋:
注意:如果以上截取有所侵權,也請作者告知,再次感謝。
 
當看到這個問題的,我想到了是窗口函數提供的累積匯總有關的解決方案。
 
准備測試數據,有關的T-SQL代碼如下:
 1 IF OBJECT_ID(N'dbo.SalesData', N'U') IS NOT NULL
 2 BEGIN
 3     DROP TABLE dbo.SalesData;
 4 END
 5 GO
 6  
 7 CREATE TABLE dbo.SalesData
 8 (   
 9     Product_Name CHAR(32) NOT NULL, --商品名稱   
10     Sale_Amount FLOAT NOT NULL   --銷售金額
11 );
12 GO
13  
14 INSERT INTO dbo.SalesData (Product_Name, Sale_Amount)
15 SELECT 'ProductNameA', 13000 UNION ALL
16 SELECT 'ProductNameA', 12000 UNION ALL
17 SELECT 'ProductNameA', 9000 UNION ALL
18 SELECT 'ProductNameB', 167000 UNION ALL
19 SELECT 'ProductNameB', 137000 UNION ALL
20 SELECT 'ProductNameB', 107000 UNION ALL
21 SELECT 'ProductNameC', 78000 UNION ALL
22 SELECT 'ProductNameC', 12000;
23 GO

執行以下的T-SQL代碼:

1 SELECT Product_Name, Sale_Amount
2 FROM dbo.SalesData;
3 GO

得到的結果如下:

 
注意:以上測試數據也是來自瀟瀟隱者的博文,我再次基礎上做了調整。
 
基於SQL Server 2005和以上的版本的解決方案的T-SQL代碼如下:
 1 -- SQL Server 2005 和以上版本 使用子查詢的解決方案
 2 SELECT *
 3 FROM (
 4     SELECT T.Product_Name, T.Sale_Amount, T.rownum, T.Sale_TotalAmount, T.Sale_AccumulateAmount
 5         ,100.0 * T.Sale_AccumulateAmount / T.Sale_TotalAmount AS Sale_AccumulatePercent
 6     FROM (
 7         SELECT T.Product_Name, T.Sale_Amount, ROW_NUMBER() OVER (ORDER BY T.Sale_Amount DESC) AS rownum, T2.Sale_TotalAmount
 8             ,(SELECT SUM(Sale_Amount) FROM dbo.SalesData WHERE Sale_Amount >= T.Sale_Amount) AS Sale_AccumulateAmount
 9         FROM dbo.SalesData AS T
10         CROSS APPLY (SELECT SUM(Sale_Amount) AS Sale_TotalAmount FROM dbo.SalesData) AS T2
11     ) AS T
12 ) AS T
13 WHERE T.Sale_AccumulatePercent <= 80;
14 GO
15  

執行后的查詢結果如下:

 
基於SQL Server 2012和以上的版本的解決方案的T-SQL代碼如下:
 1 -- SQL Server 2012 和以上 使用增強的窗口函數的解決方案
 2 SELECT T.Product_Name, T.Sale_Amount, T.rownum, T.Sale_TotalAmount, T.Sale_AccumulateAmount, T.Sale_AccumulatePercent
 3 FROM (
 4     SELECT T.Product_Name, T.Sale_Amount, T.rownum, T.Sale_TotalAmount, T.Sale_AccumulateAmount
 5     ,100.0 * T.Sale_AccumulateAmount / T.Sale_TotalAmount AS Sale_AccumulatePercent /*累計銷售額在總銷售中的百分比*/
 6     FROM (
 7         SELECT Product_Name, Sale_Amount, ROW_NUMBER() OVER (ORDER BY Sale_Amount DESC) AS rownum /*行號行數,具有不確定性,窗口排序字句列不唯一*/
 8         ,SUM(Sale_Amount) OVER () AS Sale_TotalAmount /*總銷售額*/
 9         ,SUM(Sale_Amount) OVER (ORDER BY Sale_Amount DESC ROWS UNBOUNDED PRECEDING) AS Sale_AccumulateAmount /* 累計銷售額,使用了SQL Server 2012窗口函數新增的窗口框架字句,也等同於 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW*/
10         FROM dbo.SalesData
11     ) AS T
12 ) AS T
13 WHERE T.Sale_AccumulatePercent <= 90;
14 GO

執行后的查詢結果如下:

 
博友有其他的解決方案,也請不吝賜教,萬分感謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM