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
View Code

查询结果:

 结语

怎么样,是不是高级的函数简洁优雅又高效,所以还是跟紧微软爸爸的步伐,不断学习和使用新方法吧,不仅仅是充实自己,更重要是提高工作质量。

 

 
posted @ 2017-03-16 21:51  jiafeng  阅读(9407)  评论(5编辑  收藏  举报