时间:2021-07-01 10:21:17 帮助过:2人阅读
执行以下的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
执行后的查询结果如下:
博友有其他的解决方案,也请不吝赐教,万分感谢。SQL Server求解最近多少销售记录的销售额占比总销售额的指定比例
标签: