sqlserver每行都有累加,你怎么搞,窗口函数来帮忙!!!
在统计中我们经常会面临复杂的查询,例如累加,最近也遇到一个很好的例子,今天我们一起来看看:
有一个关于销售数据的视图,字段有:emptyid(员工编号),ordermonth(月份,格式为'年-月-日'),qty(销售额)。每个员工每个月只有一条记录,部分内容如图所示:
请你编写查询语句,按月份升序,统计出每个员工每个月对应的累积销售额。
实现方式1:sqlserver2012及以上
--2012版及以上的实现方式,超简单,一句话搞定 SELECT emptyid,ordermonth,qty, SUM(qty) OVER(PARTITION BY emptyid ORDER BY ordermonth ROWS unbounded preceding -- unbounded preceding只能在2012及以上版本中才能执行 ) AS s FROM dbo.EmpOders
查询结果:
实现方式2:sqlserver2005&2008
1 /*1.先分区,并编号*/ 2 WITH cte AS 3 ( 4 SELECT emptyid AS emptyid ,ordermonth AS ordermonth,qty AS qty, 5 ROW_NUMBER() --编号。用于下一步的嵌套子查询 6 OVER(PARTITION BY emptyid --根据不同员工编号,分成若干区 7 ORDER BY ordermonth --同一个分区内按月份升序 8 ) AS rnm 9 FROM dbo.EmpOders 10 ) 11 12 /*2.再累加。用到了嵌套子查询*/ 13 SELECT emptyid,ordermonth,qty, 14 ( SELECT SUM(qty) 15 FROM cte t1 16 WHERE t1.rnm<=t2.rnm --累加月份的范围是小于等于当前月份的 17 AND 18 t1.emptyid=t2.emptyid --保证是同一个员工的销售额在做累加 19 ) AS '累积销售额' 20 FROM cte t2
查询结果:
结语
怎么样,是不是高级的函数简洁优雅又高效,所以还是跟紧微软爸爸的步伐,不断学习和使用新方法吧,不仅仅是充实自己,更重要是提高工作质量。