首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL SUM(CASE WHEN) 條件聚合實戰:單次掃描統計多維度指標 (完成/未完成、男/女、等級分布)

     編輯:關於SqlServer

核心模式

SELECT 
    SUM(CASE WHEN 條件 THEN 1 ELSE 0 END) AS 條件計數,
    SUM(CASE WHEN 條件 THEN 數值欄位 ELSE 0 END) AS 條件求和,
    COUNT(*) AS 總行數
FROM 表;

優勢:單次全表掃描完成多條件統計,避免多次 COUNT(*) WHERE ... 重複掃描。

範例 1:任務執行狀態統計

SELECT 
    COUNT(er.execute_result) AS 總筆數,
    SUM(CASE er.execute_result WHEN 1 THEN 1 ELSE 0 END) AS 完成數,
    SUM(CASE er.execute_result WHEN 0 THEN 1 ELSE 0 END) AS 未完成數
FROM taw_wp_execute_result er;

範例 2:分數等級分布 (CASE 簡潔形式)

SELECT 
    CASE 
        WHEN er.execute_result > 0 THEN 'A'
        ELSE 'B'
    END AS 等級,
    COUNT(*) AS 人數
FROM taw_wp_execute_result er
GROUP BY CASE 
    WHEN er.execute_result > 0 THEN 'A'
    ELSE 'B'
END;

範例 3:班級男女生統計 (假設 gender: 'M'/'F')

SELECT 
    SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS 男生數,
    SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS 女生數,
    COUNT(*) AS 總人數
FROM Students;

進階技巧

技巧語法說明
條件求和SUM(CASE WHEN cond THEN amount ELSE 0 END)如:各狀態金額統計
條件平均AVG(CASE WHEN cond THEN value END)ELSE NULL 時 AVG 自動忽略
條件 MAX/MINMAX(CASE WHEN cond THEN value END)同理
多條件交叉SUM(CASE WHEN c1 AND c2 THEN 1 END)如:男生且及格
動態列輸出配合 PIVOT/動態 SQL行轉列報表

效能對比

-- ❌ 多次掃描 (3 次全表)
SELECT COUNT(*) FROM t WHERE status = 1;
SELECT COUNT(*) FROM t WHERE status = 0;
SELECT COUNT(*) FROM t;

-- ✅ 單次掃描 (1 次全表)
SELECT 
    SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS cnt1,
    SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS cnt0,
    COUNT(*) AS total
FROM t;

百萬級資料表,單次掃描可節省 60%+ IO 時間。

跨資料庫備註

  • SQL Server / PostgreSQL / Oracle / MySQL 8.0+:標準語法完全相容
  • MySQL 5.7:SUM(IF(cond, 1, 0)) 等價
  • Oracle 早期:DECODE(cond, 1, 1, 0) 或 CASE
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved