ใช้ SUM(CASE WHEN condition THEN 1 ELSE 0 END) เพื่อนับจำนวนแถวที่ตรงเงื่อนไขแต่ละข้อ แยกเป็นคอลัมน์ต่างๆ ได้ใน Query เดียว
Syntax
SELECT
group_column,
SUM(CASE WHEN condition1 THEN 1 ELSE 0 END) as count_condition1,
SUM(CASE WHEN condition2 THEN 1 ELSE 0 END) as count_condition2
FROM table_name
GROUP BY group_column;
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูล
mysql> create table DemoTable1910 ( FirstName varchar(20), Marks int ); Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1910 values('Chris',45); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1910 values('David',85); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1910 values('Chris',55); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1910 values('Chris',98); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1910 values('David',98); Query OK, 1 row affected (0.00 sec)
ข้อมูลทั้งหมด:
mysql> select * from DemoTable1910;
+-----------+-------+ | FirstName | Marks | +-----------+-------+ | Chris | 45 | | David | 85 | | Chris | 55 | | Chris | 98 | | David | 98 | +-----------+-------+ 5 rows in set (0.00 sec)
2. นับ Marks=45 และ Marks=98 แยกตามคน
mysql> select FirstName,
-> sum(case when Marks = 45 then 1 else 0 end),
-> sum(case when Marks = 98 then 1 else 0 end)
-> from DemoTable1910
-> group by FirstName;
ผลลัพธ์:
+-----------+-------------------------------------------+-------------------------------------------+ | FirstName | sum(case when Marks=45 then 1 else 0 end) | sum(case when Marks=98 then 1 else 0 end) | +-----------+-------------------------------------------+-------------------------------------------+ | Chris | 1 | 1 | | David | 0 | 1 | +-----------+-------------------------------------------+-------------------------------------------+ 2 rows in set (0.00 sec)
การอธิบาย
- Chris: มี Marks 45 (1 ครั้ง), 55 (1), 98 (1) → นับ 45 ได้ 1, นับ 98 ได้ 1
- David: มี Marks 85 (1), 98 (1) → นับ 45 ได้ 0, นับ 98 ได้ 1
เทคนิคเพิ่มเติม: Pivot Table (Crosstab)
SELECT
FirstName,
SUM(CASE WHEN Marks BETWEEN 0 AND 59 THEN 1 ELSE 0 END) AS 'Fail',
SUM(CASE WHEN Marks BETWEEN 60 AND 69 THEN 1 ELSE 0 END) AS 'D',
SUM(CASE WHEN Marks BETWEEN 70 AND 79 THEN 1 ELSE 0 END) AS 'C',
SUM(CASE WHEN Marks BETWEEN 80 AND 89 THEN 1 ELSE 0 END) AS 'B',
SUM(CASE WHEN Marks >= 90 THEN 1 ELSE 0 END) AS 'A'
FROM DemoTable1910
GROUP BY FirstName;
MySQL 8.0+: ใช้ FILTER Clause (ไม่รองรับโดยตรง แต่ใช้ CASE ได้)
PostgreSQL มี COUNT(*) FILTER (WHERE condition) แต่ MySQL ใช้ SUM(CASE...) แทน
สรุป: ใช้ SUM(CASE WHEN condition THEN 1 ELSE 0 END) เพื่อนับเงื่อนไขหลายข้อแยกคอลัมน์ใน Query เดียว รวมกับ GROUP BY ได้สรุปแบบ Pivot Table/Crosstab