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

MySQL: ใช้ COUNT กับ CASE WHEN เพื่อนับตามเงื่อนไข

การนับเงื่อนไขเฉพาะด้วย 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, ไม่งั้น NULL
  • COUNT(...) — นับเฉพาะค่าที่ไม่ใช่ 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 หลายครั้ง