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

 結語

怎麼樣,是否是高級的函數簡潔優雅又高效,因此仍是跟緊微軟爸爸的步伐,不斷學習和使用新方法吧,不單單是充實本身,更重要是提升工做質量。函數

相關文章
相關標籤/搜索