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

查询结果:sql

 

 

实现方式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

查询结果:ide

 结语

怎么样,是否是高级的函数简洁优雅又高效,因此仍是跟紧微软爸爸的步伐,不断学习和使用新方法吧,不单单是充实本身,更重要是提升工做质量。函数

相关文章
相关标签/搜索