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

查詢結果:

 結語

怎么樣,是不是高級的函數簡潔優雅又高效,所以還是跟緊微軟爸爸的步伐,不斷學習和使用新方法吧,不僅僅是充實自己,更重要是提高工作質量。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM