1. 程式人生 > >SQL COUNT +Case When Then+IFNULL多條件判斷實現多條件複雜統計

SQL COUNT +Case When Then+IFNULL多條件判斷實現多條件複雜統計

基礎知識

COUNT()函式

函式返回匹配指定條件的行數。

SQL COUNT() 語法

  1. SQL COUNT(column_name) 語法
    COUNT(column_name) 函式返回指定列的值的數目(NULL 不計入):
    SELECT COUNT(column_name) FROM table_nam
  2. SQL COUNT(*) 語法
    COUNT(*) 函式返回表中的記錄數:
    SELECT COUNT(*) FROM table_name
  3. SQL COUNT(DISTINCT column_name) 語法
    COUNT(DISTINCT column_name) 函式返回指定列的不同值的數目:
    SELECT COUNT(DISTINCT column_name) FROM table_name

Case When Then

Case具有兩種格式。簡單Case函式和Case搜尋函式。
第一種 格式 : 簡單Case函式 :
格式說明

    case 列名

    when 條件值1 then 選擇項1

    when 條件值2 then 選項2…….

    else 預設值 end

例:

select 
     case   job_level
     when    '1'     then    '1111'
     when   '2'     then    '222'
     when   '3'
then '333'  else 'eee' end from dbo.employee

第二種 格式 :Case搜尋函式

格式說明
    case
    when 列名= 條件值1 then 選擇項1
    when 列名=條件值2 then 選項2…….
    else 預設值 end

例如:

update employee
    set e_wage =
    case
        when   job_level = '1'   then e_wage*1
        when   job_level = '2'
then e_wage*2 when job_level = '3' then e_wage*3 else e_wage*4 end

IFNULL函式用法

MySQL IFNULL函式是MySQL控制流函式之一,它接受兩個引數,如果不是NULL,則返回第一個引數。 否則,IFNULL函式返回第二個引數。
兩個引數可以是文字值或表示式。
以下說明了IFNULL函式的語法:
IFNULL(expression_1,expression_2);
如果expression_1不為NULL,則IFNULL函式返回expression_1; 否則返回expression_2的結果。

複雜統計

我們有一個複雜的統計,統計出各單位以各種方式辦理的案件的案件
danban形式CHECKOPTION=’danban’,單位id為UNDERTAKEUNITID
huiban形式包含zhuban和xieban
COUNDERTAKEUNITID為xieban單位id
UNDERTAKEUNITID為zhuban的id
fenban形式c.CHECKOPTION=’fenban’ ,單位id為UNDERTAKEUNITID

我們要統計出
辦理單位統計

SELECT c.unitid,c.unit,
COUNT(CASE WHEN c.CHECKOPTION='danban' then 1 else NULL END) as danban,
COUNT(CASE WHEN c.CHECKOPTION='huiban' and c.COUNDERTAKEUNITID is not NULL then 1 else NULL END) as xieban,
COUNT(CASE WHEN c.CHECKOPTION='huiban' and c.UNDERTAKEUNITID is not NULL then 1 else NULL END) as zhuban,
COUNT(CASE WHEN c.CHECKOPTION='fenban' then 1 else NULL END) as fenban
from 
(
    SELECT
    a.UNDERTAKEUNIT,a.UNDERTAKEUNITID,a.COUNDERTAKEUNIT,a.COUNDERTAKEUNITID,a.CHECKOPTION,
    IFNULL(a.COUNDERTAKEUNITID,a.UNDERTAKEUNITID) as unitid,
    IFNULL(a.COUNDERTAKEUNIT,a.UNDERTAKEUNIT)as unit
    FROM
        unit_undertakeinfo a  
) c
GROUP BY c.unitid