• 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

    查询结果:

     结语

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

     
  • 相关阅读:
    排序题目
    力扣二分法题目
    力扣动态相似题目
    875爱吃香蕉的珂珂
    410分割数组的最大值
    1335工作计划的最低难度
    287寻找重复数
    69X的平方根
    力扣相似题目
    解决Linux虚拟机内 /mnt/hgfs路径下文件为空问题
  • 原文地址:https://www.cnblogs.com/zjfblog/p/6561819.html
Copyright © 2020-2023  润新知