文章来源:
https://www.cnblogs.com/Lumia1020/p/5439982.html
前几天,有个朋友刚好问到本人有关 SQL 语句,大致是原表有两列,分别为月份、月份销售额,而需要一条 SQL 语句实现统计出每个月份以及当前月以前月份销售额和。尼玛,感觉还是没有说清,下面用图表示。
SQL 测试表脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
DECLARE @ Temp Table ( ID INT , --- 月份 MoneyData Float --- 金额 ) insert INTO @ TEMP SELECT 1,100 UNION ALL SELECT 2,200 UNION ALL SELECT 3,300 UNION ALL SELECT 4,400 UNION ALL SELECT 5,500 UNION ALL SELECT 6,600 UNION ALL SELECT 7,600 |
一 自连接
1
2
3
4
5
|
SELECT A.ID, SUM (B.MoneyData) FROM @ Temp A INNER JOIN @ Temp B ON A.ID>=B.ID GROUP BY A.ID ------ 重点在于 ON 条件,通过自连接 A.ID >= B.ID ,可获取所需数据,再通过 GROUP BY 、 SUM 即可统计求和 |
二 开窗函数
1
2
3
4
5
6
|
SELECT ID, MoneyData, SUM (MoneyData) OVER( ) AS '总销售额' , SUM (MoneyData) OVER( PARTITION BY ID ) AS '月销售额' , SUM (MoneyData) OVER( ORDER BY ID ASC ) AS '当月+当月前销售额' FROM @ Temp ---- 此处,使用开窗函数使用更为简单,不过,其中 SUM() OVER ( ORDER BY ID ASC ) 即可实现以上功能 |
关于,开窗函数的具体用法,可参考微软 MSDN 官方 API 文档,最后,推荐一本开窗函数书:基于 SQL SERVER 2012 窗口函数。
参考:https://msdn.microsoft.com/zh-cn/library/ms173454.aspx