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--