自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

巧用SQL進(jìn)行數(shù)據(jù)累加

數(shù)據(jù)庫
對數(shù)據(jù)進(jìn)行累加的方法有很多種。經(jīng)常用的就是Excel的的累加功能。本文中筆者巧妙的利用SQL對數(shù)據(jù)進(jìn)行累加。

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

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

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

結(jié)果

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

當(dāng)然這個結(jié)果在Excel中十分好實(shí)現(xiàn),只需要一個公式就好:

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

下面,如果用sql實(shí)現(xiàn)能有什么辦法呢?首先想到的是游標(biāo)。

對游標(biāo)的確可以實(shí)現(xiàn),寫程序也可以實(shí)現(xiàn),因?yàn)樗麄兊乃枷胧且粯拥模号袛嘁幌旅质遣皇且呀?jīng)遍歷過了,如果遍歷過了,就累加一下,如果沒有就從0加起。這樣很好理解,但是寫的很費(fèi)時,其實(shí)一條sql語句就可以實(shí)現(xiàn)的,那就是子查詢。

 

  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查詢的結(jié)果是面向集合,而這種嵌套的子查詢恰恰就是在整個結(jié)果集返回之前做的對于每一行的運(yùn)算。也許這樣的寫法不是很容易理解,那么下面這個寫法應(yīng)該容易理解多了。

  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 

這樣用聯(lián)合的方式就好理解一些,其實(shí)這樣就是把每一行對應(yīng)比他月份小的值分成一組,然后進(jìn)行運(yùn)算,如果這樣不明白,那么下面的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 

這樣的結(jié)果就顯而易見了

 

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

 子查詢執(zhí)行計劃

join執(zhí)行計劃

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

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

【編輯推薦】

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

2016-08-21 15:02:47

APP推廣數(shù)據(jù)分析數(shù)據(jù)統(tǒng)計工具

2011-08-02 15:39:30

SQL Server iSql

2020-12-14 13:24:17

PandasSQL數(shù)據(jù)集

2023-05-05 19:16:22

Python數(shù)據(jù)清洗

2017-10-31 11:55:46

sklearn數(shù)據(jù)挖掘自動化

2024-07-26 21:36:43

2021-12-28 11:23:36

SQLServerExcel數(shù)據(jù)分析

2010-09-26 10:35:47

sql替換語句

2019-09-27 12:44:03

數(shù)據(jù)建模企業(yè)數(shù)據(jù)存儲

2023-05-05 19:29:41

2019-09-30 10:12:21

機(jī)器學(xué)習(xí)數(shù)據(jù)映射

2013-06-08 14:50:10

rman數(shù)據(jù)恢復(fù)

2022-06-02 13:59:57

數(shù)據(jù)遷移數(shù)據(jù)

2022-11-02 14:45:24

Python數(shù)據(jù)分析工具

2009-03-16 10:29:45

數(shù)據(jù)挖掘過濾器Access

2009-09-08 16:50:12

使用LINQ進(jìn)行數(shù)據(jù)轉(zhuǎn)

2011-03-17 13:23:08

數(shù)據(jù)導(dǎo)入導(dǎo)出

2025-02-10 10:29:32

2022-04-15 10:36:11

數(shù)據(jù)治理企業(yè)

2019-01-15 14:21:13

Python數(shù)據(jù)分析數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號