最近工作中,有需要新做數據的統計匯總工作,本來一開始打算用Python的pandas庫去數據庫里統計的,
后來想着能否用一條sql語句解決問題。發現count()函數內可以加條件計數,sql模板如下 :
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(release_year = '2006' or NULL) 這部分 為什么要加上or NULL 直接count(release_year='2006')有什么問題嗎?不就是要找release_year = '2006'的數據嗎,為什么要計算NULL的數據?
因為 當 release_year不是 2006時 ,release_year='2006' 結果false 不是 NULL,Count在 值是NULL是 不統計數, (count('任意內容')都會統計出所有記錄數,因為count只有在遇見null時不計數,即count(null)==0,因此前者單引號內不管輸入什么值都會統計出所有記錄數)至於加上or NULL , 很像其他編程里的or運算符,第一個表達式是true就是不執行or后面的表達式,第一個表達式是false 執行or后面的表達式 。當release_year不為2006時release_year = '2006' or NULL 的結果是NULL,Count才不會統計上這條記錄數
案例
統計要求:
最終 sql如下:
select 'xx大學' as `平台`,city_name,col_name,count(1) as '總人數', count(idcard_status="身份證有效" OR NULL) as '身份證合規', count(idcard_status="身份證無效" OR NULL) as '身份證不合規', count(xueshengzheng_satus="學生證有效" OR NULL) as '學生證合規', count(xueshengzheng_satus="學生證無效" OR NULL) '學生證不合規', count(xueshengzheng_satus="學生證有效"and idcard_status="身份證有效" OR NULL) as '雙證合規', count(xueshengzheng_satus="學生證無效"and idcard_status="身份證無效" OR NULL) as '雙證不合規' from idcard_list_bak_20210714 group by city_name,col_name
參考:
https://blog.csdn.net/JAVA_nihao/article/details/98972263
https://blog.csdn.net/qq_32719287/article/details/79513164