因为前一段时间胃痛,致使博客园博客都停更了一个月左右。近几天,胃病终于稍微有所好转,决定从新写博文。sql
前几天,有个朋友恰好问到本人有关 SQL 语句,大体是原表有两列,分别为月份、月份销售额,而须要一条 SQL 语句实现统计出每一个月份以及当前月之前月份销售额和。尼玛,感受仍是没有说清,下面用图表示。函数
SQL 测试表脚本 测试
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
一 自链接spa
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 便可统计求和
二 开窗函数blog
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博客