成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧用SQL進行數據累加

數據庫
對數據進行累加的方法有很多種。經常用的就是Excel的的累加功能。本文中筆者巧妙的利用SQL對數據進行累加。

比如有這樣一個需求,一張表格(User_Salary)包含每個人(UserName)每個月份(Month)發的薪水(Salary)

求這樣一個結果集:每個人每月所發薪水及累計所得薪水和,如下表

UserName Month Salary
AAA 2010/12 1000
AAA 2011/01 2000
AAA 2011/02 3000
BBB 2010/12 2000
BBB 2011/01 2500
BBB 2011/02 2500

結果

UserName Month Salary Cumulation
AAA 2010/12 1000 1000
AAA 2011/01 2000 3000
AAA 2011/02 3000 6000
BBB 2010/12 2000 2000
BBB 2011/01 2500 4500
BBB 2011/02 2500 7000

當然這個結果在Excel中十分好實現,只需要一個公式就好:

注意G2的公式一定要保持***個列不動所以就是$F$2:F2,然后向下拖一下就可以,但是,這只適用于數據固定的情況下,試想,如果有100個員工的數據,豈不是要拖100下。當然也可能有其他辦法,這個我就不知道了。

下面,如果用sql實現能有什么辦法呢?首先想到的是游標。

對游標的確可以實現,寫程序也可以實現,因為他們的思想是一樣的:判斷一下名字是不是已經遍歷過了,如果遍歷過了,就累加一下,如果沒有就從0加起。這樣很好理解,但是寫的很費時,其實一條sql語句就可以實現的,那就是子查詢。

 

  1. create table User_Salary (UserName nvarchar(200), Month nvarchar(20), Salary int)     
  2.       
  3. go     
  4.       
  5. insert into User_Salary (UserName,Month,Salary ) values('AAA','2010/12',1000)     
  6. insert into User_Salary (UserName,Month,Salary ) values('AAA','2011/01',2000)     
  7. insert into User_Salary (UserName,Month,Salary ) values('AAA','2011/02',3000)     
  8. insert into User_Salary (UserName,Month,Salary ) values('BBB','2010/12',2000)     
  9. insert into User_Salary (UserName,Month,Salary ) values('BBB','2011/01',2500)    
  10. insert into User_Salary (UserName,Month,Salary ) values('BBB','2011/02',2500)    
  11.      
  12. go    
  13.      
  14. select UserName,Month,Salary,    
  15.     Cummulation=(    
  16.         select SUM(Salary)     
  17.         from     
  18.             User_Salary i    
  19.         where     
  20.             i.UserName=o.UserName and i.Month<=o.Month    
  21.         )    
  22. from User_Salary o    
  23. order by 1,2    
  24.      
  25. go    
  26.      
  27. drop table User_Salary 

大家知道SQL查詢的結果是面向集合,而這種嵌套的子查詢恰恰就是在整個結果集返回之前做的對于每一行的運算。也許這樣的寫法不是很容易理解,那么下面這個寫法應該容易理解多了。

  1. create table User_Salary (UserName nvarchar(200), Month nvarchar(20), Salary int)    
  2.       
  3. go    
  4.    
  5. insert into User_Salary (UserName,Month,Salary ) values('AAA','2010/12',1000)    
  6. insert into User_Salary (UserName,Month,Salary ) values('AAA','2011/01',2000)    
  7. insert into User_Salary (UserName,Month,Salary ) values('AAA','2011/02',3000)    
  8. insert into User_Salary (UserName,Month,Salary ) values('BBB','2010/12',2000)    
  9. insert into User_Salary (UserName,Month,Salary ) values('BBB','2011/01',2500)   
  10. insert into User_Salary (UserName,Month,Salary ) values('BBB','2011/02',2500)   
  11.     
  12. go    
  13.      
  14. select    
  15.      A.UserName,A.Month,MAX(A.Salary) as Salary,SUM (B.Salary) as Accumulation    
  16. from   
  17.      User_Salary A inner join User_Salary B   
  18.  ON    
  19.      A.UserName = B.UserName   
  20.  where    
  21.      B.Month <= A.Month   
  22.  group by   
  23.      A.UserName,A.Month   
  24. order by       
  25.      A.UserName,A.Month   
  26.      
  27. go   
  28.      
  29. drop table User_Salary 

這樣用聯合的方式就好理解一些,其實這樣就是把每一行對應比他月份小的值分成一組,然后進行運算,如果這樣不明白,那么下面的sql會使這個查詢更加好理解:

  1. select     
  2.    A.*,B.*    
  3. from     
  4.    User_Salary A inner join User_Salary B    
  5. ON     
  6.    A.UserName = B.UserName     
  7. where     
  8.    B.Month <= A.Month     
  9. order by 1,2 

這樣的結果就顯而易見了

 

這就是子查詢相關的遞歸(可以這么說?)算法。

 子查詢執行計劃

join執行計劃

通過上述2個執行計劃,雖然執行計劃不同,但大體一致,這其中的區別我就不太明白了(不知道是先排序再join好 還是先join在排序好,但是我個人覺得第二種比較容易理解.).

原文出處:http://www.cnblogs.com/mylhei/archive/2011/03/09/1978184.html

【編輯推薦】

  1. MySQL技巧:結合相關參數 做好Limit優化
  2. SQL Server數據庫六種數據移動方法
  3. MySQL數據庫的優化(上)單機MySQL數據庫的優化
  4. MySQL數據庫的優化(下)MySQL數據庫的高可用架構方案
  5. MySQL數據庫安全解決方案
責任編輯:艾婧 來源: 博客園
相關推薦

2016-08-21 15:02:47

APP推廣數據分析數據統計工具

2011-08-02 15:39:30

SQL Server iSql

2020-12-14 13:24:17

PandasSQL數據集

2017-10-31 11:55:46

sklearn數據挖掘自動化

2023-05-05 19:16:22

Python數據清洗

2010-09-26 10:35:47

sql替換語句

2024-07-26 21:36:43

2021-12-28 11:23:36

SQLServerExcel數據分析

2019-09-30 10:12:21

機器學習數據映射

2023-05-05 19:29:41

2019-09-27 12:44:03

數據建模企業數據存儲

2013-06-08 14:50:10

rman數據恢復

2009-09-08 16:50:12

使用LINQ進行數據轉

2022-11-02 14:45:24

Python數據分析工具

2009-03-16 10:29:45

數據挖掘過濾器Access

2022-06-02 13:59:57

數據遷移數據

2010-09-16 17:56:31

SQL server臨

2011-03-17 13:23:08

數據導入導出

2019-01-15 14:21:13

Python數據分析數據

2025-02-10 10:29:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天操欧美 | 久久99精品久久久97夜夜嗨 | 日本在线视频一区二区 | 日韩在线国产精品 | 99re视频| 国产精品久久久久久福利一牛影视 | 久久久久久毛片免费观看 | 免费在线观看一区二区 | av日韩在线播放 | 久久91精品国产一区二区三区 | 97福利在线| 91xxx在线观看 | 亚洲精选久久 | 亚洲欧洲精品在线 | 国产视频不卡一区 | 欧美日韩在线成人 | 91免费观看 | 欧美日韩一区二区三区四区 | 99精品免费在线观看 | 妖精视频一区二区三区 | 日韩欧美一区二区三区在线播放 | 请别相信他免费喜剧电影在线观看 | 蜜桃传媒一区二区 | 久久久免费少妇高潮毛片 | 欧美精品一区二区三区四区 在线 | 日韩精品网站 | 国产美女网站 | 日韩欧美成人精品 | 九九热精品在线 | 色性av | 亚洲一区二区精品视频 | 精品免费国产一区二区三区 | 国产精品91视频 | 99爱视频 | 亚洲人成人一区二区在线观看 | 天天躁日日躁狠狠的躁天龙影院 | 国产精品永久久久久久久www | 久久精品国产免费 | 国产女人与拘做受免费视频 | 97精品超碰一区二区三区 | av看片|