最近在代碼中有需要做頁面統計數據總數,於是就按照條件規矩的表連接分組查詢,先查出總數,然後對分組過後的數據進行單個查詢。寫完就跑了一下,發現查詢速度有點慢(數據暫時還不多),想着以後數據多的話,頁面會不會很慢,能不能一個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 組織機構