SQL中的count()、sum()函數內加條件

最近在代碼中有需要做頁面統計數據總數,於是就按照條件規矩的表連接分組查詢,先查出總數,然後對分組過後的數據進行單個查詢。寫完就跑了一下,發現查詢速度有點慢(數據暫時還不多),想着以後數據多的話,頁面會不會很慢,能不能一個sql,把所有的數量都查出來。這就用到了count()函數內加條件計數,測試了一下,數據正確,sql如下 :

 
select  a.衛生院順序號,count(a.ID) as 體檢總數,
count(case when a.是否高血壓='是' then 1 else null end)as 高血壓總數,
count(case when a.是否糖尿病='是' then 1 else null end)as 糖尿病總數,
count(case when a.是否腦卒中='是' then 1 else null end)as 腦卒中總數,
count(case when a.是否冠心病='是' then 1 else null end)as 冠心病總數
from  表  a   where YEAR(a.tjrq) = DATEPART(year, GETDATE())  GROUP BY a.機構號

還有一種方法就是

SELECT
    COUNT(1) AS '總數',
     COUNT (xjzt = '1' OR NULL) AS '狀態1',
     COUNT (xjzt = '2' OR NULL) AS '狀態2'
FROM
    t_table
WHERE
    sfsc = 0
GROUP BY
    '字段1',
    '字段2' 

至於爲什麼要or null     如count(xjzt= '1' or NULL) 這部分 爲什麼要加上or NULL 直接count(xjzt= '1' )有什麼問題嗎?不就是要找xjzt= '1' 的數據嗎,爲什麼要計算NULL的數據

答案:

因爲 當 xjzt 不是 1時 ,xjzt= '1' 結果false 不是 NULL,

Count在 值是NULL是 不統計數, (count('任意內容')都會統計出所有記錄數,因爲count只有在遇見null時不計數,即count(null)==0,因此前者單引號內不管輸入什麼值都會統計出所有記錄數)至於加上or NULL , 很像其他編程裏的or運算符,第一個表達式是true就是不執行or後面的表達式,第一個表達式是false 執行or後面的表達式 。當xjzt 不爲1時xjzt= '1' or NULL 的結果是NULL,Count纔不會統計上這條記錄數 

 

下面sql語句意思爲  按機構分組  查詢每個機構中肝功能(肝功能其中包含血清谷丙、穀草、總膽紅素,每個項目的超過指標即爲異常)和心電圖異常人數

 select 組織機構, 
sum(case when  ((case when xqgb='' then 0  when Cast(xqgb as decimal(10,2))>40 then 1 else 0 end)+(case when xqgc='' then 0 when Cast(xqgc as decimal(10,2))>40 then 1 else 0 end)+(case when zdhs='' then 0 when Cast(zdhs as decimal(10,2))>40 then 1 else 0 end))>0 then 1 else 0 end ) as 肝功能,
sum(case when 心電圖='' or 心電圖 is null then 0 when 心電圖 like '%1%' then 0 else 1 end) as 心電圖
from  表_健康體檢表  group by 組織機構

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章