Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

นับหลายเงื่อนไขใน Query เดียวด้วย CASE WHEN และ COUNT() ใน MySQL

บทนำ

การนับจำนวนแถวที่ตรงกับหลายเงื่อนไขในคำสั่ง 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;