บทนำ
การนับจำนวนแถวที่ตรงกับหลายเงื่อนไขในคำสั่ง SELECT เดียว สามารถทำได้ด้วย COUNT(CASE WHEN ... THEN 1 END) ซึ่งจะนับเฉพาะแถวที่ตรงเงื่อนไข
ตัวอย่างการสร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
-> LastName VARCHAR(100)
-> );
Query OK, 0 rows affected (0.60 sec)
mysql> INSERT INTO DemoTable VALUES('Smith');
mysql> INSERT INTO DemoTable VALUES('Brown');
mysql> INSERT INTO DemoTable VALUES('Brown');
mysql> INSERT INTO DemoTable VALUES('Smith');
mysql> INSERT INTO DemoTable VALUES('Taylor');
mysql> INSERT INTO DemoTable VALUES('Taylor');
mysql> INSERT INTO DemoTable VALUES('Miller');
mysql> INSERT INTO DemoTable VALUES('Miller');
mysql> INSERT INTO DemoTable VALUES('Miller');
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable;
ผลลัพธ์
+----------+
| LastName |
+----------+
| Smith |
| Brown |
| Brown |
| Smith |
| Taylor |
| Taylor |
| Miller |
| Miller |
| Miller |
+----------+
9 rows in set (0.00 sec)
คำสั่งนับความถี่ของแต่ละนามสกุลใน Query เดียว
mysql> SELECT
-> COUNT(CASE WHEN LastName = 'Smith' THEN 1 END) AS SmithCount,
-> COUNT(CASE WHEN LastName = 'Brown' THEN 1 END) AS BrownCount,
-> COUNT(CASE WHEN LastName = 'Taylor' THEN 1 END) AS TaylorCount,
-> COUNT(CASE WHEN LastName = 'Miller' THEN 1 END) AS MillerCount
-> FROM DemoTable;
ผลลัพธ์
+------------+------------+-------------+-------------+
| SmithCount | BrownCount | TaylorCount | MillerCount |
+------------+------------+-------------+-------------+
| 2 | 2 | 2 | 3 |
+------------+------------+-------------+-------------+
1 row in set (0.00 sec)
คำอธิบาย
CASE WHEN condition THEN 1 ENDคืนค่า 1 เมื่อตรงเงื่อนไข, NULL เมื่อไม่ตรงCOUNT()นับเฉพาะค่าที่ไม่ใช่ NULL → นับได้เฉพาะแถวที่ตรงเงื่อนไข- ผลลัพธ์ออกมาเป็น 1 แถว หลายคอลัมน์ (Pivot Style)
วิธีอื่น: Conditional Aggregation กับ SUM
SELECT
SUM(CASE WHEN LastName = 'Smith' THEN 1 ELSE 0 END) AS SmithCount,
SUM(CASE WHEN LastName = 'Brown' THEN 1 ELSE 0 END) AS BrownCount,
...
FROM DemoTable;
ผลลัพธ์เหมือนกัน แต่ใช้ SUM แทน COUNT (นับ 1/0 แทน 1/NULL)
การประยุกต์: Pivot Table แบบง่าย
SELECT
Department,
SUM(CASE WHEN Gender = 'M' THEN 1 ELSE 0 END) AS MaleCount,
SUM(CASE WHEN Gender = 'F' THEN 1 ELSE 0 END) AS FemaleCount,
COUNT(*) AS Total
FROM Employees
GROUP BY Department;