前几天,有个朋友刚好问到本人有关 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 窗口函数。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3131531/ ,如需转载,请注明出处,否则将追究法律责任。