การนับเงื่อนไขเฉพาะด้วย COUNT(CASE WHEN ...)
เทคนิคนับแถวที่ตรงเงื่อนไขเฉพาะภายใน COUNT() ใช้ CASE WHEN คืนค่า 1 เมื่อตรงเงื่อนไข ไม่งั้น NULL (เพราะ COUNT นับเฉพาะค่า non-NULL)
สร้างตารางและข้อมูล
mysql> create table DemoTable1374 (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(20),
-> Score int
-> );
Query OK, 0 rows affected (0.61 sec)
mysql> insert into DemoTable1374(Name, Score) values('Chris', 45);
mysql> insert into DemoTable1374(Name, Score) values('David', 78);
mysql> insert into DemoTable1374(Name, Score) values('Bob', 45);
mysql> insert into DemoTable1374(Name, Score) values('Mike', 75);
mysql> insert into DemoTable1374(Name, Score) values('Carol', 45);
mysql> insert into DemoTable1374(Name, Score) values('Adam', 89);
ข้อมูลทั้งหมด
+----+-------+-------+ | Id | Name | Score | +----+-------+-------+ | 1 | Chris | 45 | | 2 | David | 78 | | 3 | Bob | 45 | | 4 | Mike | 75 | | 5 | Carol | 45 | | 6 | Adam | 89 | +----+-------+-------+
คำสั่ง COUNT กับ CASE WHEN
mysql> select count(case when Score = 45 then 1 else null end) as SpecificCondition
-> from DemoTable1374;
ผลลัพธ์
+-------------------+ | SpecificCondition | +-------------------+ | 3 | +-------------------+
หลักการทำงาน
case when Score = 45 then 1 else null end— คืน 1 ถ้า Score=45, ไม่งั้น NULLCOUNT(...)— นับเฉพาะค่าที่ไม่ใช่ NULL (คือแถวที่ Score=45)
รูปแบบย่อ (Shorthand)
-- ใช้ SUM แทน (TRUE=1, FALSE=0)
SELECT SUM(Score = 45) AS SpecificCondition FROM DemoTable1374;
-- หรือใช้ COUNT กับเงื่อนไขโดยตรง (MySQL รองรับ)
SELECT COUNT(Score = 45 OR NULL) ... -- ไม่แนะนำ เพราะอ่านยาก
หลายเงื่อนไขพร้อมกัน (Conditional Aggregation)
SELECT COUNT(*) AS Total, SUM(Score = 45) AS Count_45, SUM(Score >= 80) AS Count_80plus, AVG(Score) AS AvgScore FROM DemoTable1374;
ผลลัพธ์
+-------+-----------+--------------+----------+ | Total | Count_45 | Count_80plus | AvgScore | +-------+-----------+--------------+----------+ | 6 | 3 | 2 | 69.8333 | +-------+-----------+--------------+----------+
ข้อดี: สแกนตารางเพียงครั้งเดียว (single pass) ได้หลายสถิติพร้อมกัน — เร็วกว่ารัน COUNT หลายครั้ง