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

นับเงื่อนไขหลายอย่างใน MySQL ด้วย CASE WHEN ภายใน SUM

ใช้ 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