SELECT
SUM(CASE WHEN 條件 THEN 1 ELSE 0 END) AS 條件計數,
SUM(CASE WHEN 條件 THEN 數值欄位 ELSE 0 END) AS 條件求和,
COUNT(*) AS 總行數
FROM 表;
優勢:單次全表掃描完成多條件統計,避免多次 COUNT(*) WHERE ... 重複掃描。
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;
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;
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/MIN | MAX(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 時間。
SUM(IF(cond, 1, 0)) 等價DECODE(cond, 1, 1, 0) 或 CASE