程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2中使用sum替代count的查詢

DB2中使用sum替代count的查詢

編輯:DB2教程


DB2中使用sum替代count的查詢   sum函數是對列的值進行統計,求和;  www.2cto.com   count函數對滿足條件的列進行累計,滿足條件就加一。 常用count函數來統計滿足某條件的記錄數,如,統計學生信息表student中的男生人數: [sql] select count(*) from student where sex='M'     常用sum函數來對滿足條件的數據進行求和,如,計算學生成績表score中'Scott'的總成績: [sql]  select sum(achv) from score where stu_name='Scott' and stu_id='120010'     其實除了統計所有表中的行外,其他情況下的count都能用sum來替代。 例如上面統計學生中男生人數,可以這樣寫: [sql]  select sum(case when sex='M' then 1 else 0 end)     from student   例2:統計employee中所有員工數量,和男性員工數量 [sql]  select 'all',count(*)      from employee     union all    select 'man',count(*)      from employee     where sex='M'   1   2   --- -----------   man          23   all          42   下面是使用sum函數來替代count男性員工: [sql]  select 'man',sum(case when sex='M' then 1 else 0 end)      from employee    union all    select 'all',count(*)      from employee   1   2   --- -----------   all          42   man          23   如果要統計所有男性人數和所有女性人數,還有所有員工人數呢? 如果使用count函數,則需要寫三個查詢,然後將其union all起來,得到我們的數據: [sql]  select 'man',count(*)      from employee     where sex='M'     union all    select 'femail',count(*)      from employee     where sex ='F'     union all    select 'all',count(*)      from employee    1      2   ------ -----------   man             23   femail          19   all             42   這個查詢的實現,需要讀取三次表,效率自然而然低,那我們為何不在一次讀取表的時候,都統計到呢? 讀一次表統計所有數據,那麼count(*),count(column_name),count(0),count(null)等這些統計的結果相同嗎? count(*)常用於統計符合條件的行數; count(0)或者count(1)在統計符合記錄的行數目,與count(*)相同作用; count(column_name)就不一樣了,它將會過濾掉column is null的值。 [sql]  select count(case when 1=0 then 1 else null end)cnt1,          count(case when 1=1 then 1 else null end) cnt2    from sysibm.sysdummy1   CNT1        CNT2   ----------- -----------             0           1   再來看下面一個例子: [sql]  db2 => select * from test01   COL1  COL2   ----- -----   A01   -   -     B01   -     -   A02   B02   A03   -      db2 => select count(*) cnt1,count(1) cnt2,count(col1) cnt3,count(col2) cnt4 from test01   CNT1        CNT2        CNT3        CNT4   ----------- ----------- ----------- -----------             5           5           3           2   count是對符合條件的記錄進行統計,也就是說我們讀取一條記錄,判斷其符合條件之後,就讓統計變量自增1, 這樣碰到下一條符合記錄的數據時又自增1,直到讀取到表中數據的末尾; 我們可以使用sum來對count進行替代,也就是說在找到符合記錄的時候就加1,沒符合條件的記錄就加0; 這樣就可以使用sum替代count來統計employee表中數據,而且只需要讀取一次表: [sql]  select count(*) all,          sum(case when sex='M' then 1 else 0 end) man,          sum(case when sex='F' then 1 else 0 end) femail     from employee   ALL         MAN         FEMAIL   ----------- ----------- -----------            42          23          19   這個查詢在實際當中使用得最多,根據同樣的輸入,統計一個或多個字段中不同標志的記錄數。 --the end--
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved