นับเฉพาะแถวที่ตรงเงื่อนไข: ใช้ SUM(Expression) ไม่ใช่ COUNT
ใน MySQL เงื่อนไขเปรียบเทียบ (เช่น ClientName = 'Sam') จะคืนค่า 1 (TRUE) หรือ 0 (FALSE) ดังนั้น SUM(ClientName = 'Sam') จึงนับจำนวนแถวที่เป็น 'Sam' ได้โดยตรง
สร้างตารางและข้อมูล (มีค่าซ้ำและหลาย ClientId)
mysql> CREATE TABLE DemoTable1515 (
-> ClientId VARCHAR(10),
-> ClientName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.53 sec)
mysql> INSERT INTO DemoTable1515 VALUES
-> ('CLI-101', 'Chris'), ('CLI-110', 'David'), ('CLI-101', 'Bob'),
-> ('CLI-101', 'Sam'), ('CLI-101', 'Sam'), ('CLI-101', 'Mike'),
-> ('CLI-130', 'Mike'), ('CLI-101', 'Chris'), ('CLI-101', 'Sam');
Query OK, 9 rows affected
ข้อมูลทั้งหมด
+----------+------------+ | ClientId | ClientName | +----------+------------+ | CLI-101 | Chris | | CLI-110 | David | | CLI-101 | Bob | | CLI-101 | Sam | | CLI-101 | Sam | | CLI-101 | Mike | | CLI-130 | Mike | | CLI-101 | Chris | | CLI-101 | Sam | +----------+------------+
คำสั่ง: นับ 'Sam' และนับทั้งหมด ใน ClientId = 'CLI-101'
mysql> SELECT ClientId,
-> SUM(ClientName = 'Sam') AS NameOn101Id,
-> COUNT(*) AS TotalNameOn101
-> FROM DemoTable1515
-> WHERE ClientId = 'CLI-101';
ผลลัพธ์
+----------+-------------+----------------+ | ClientId | NameOn101Id | TotalNameOn101 | +----------+-------------+----------------+ | CLI-101 | 3 | 7 | +----------+-------------+----------------+
คำอธิบาย
WHERE ClientId = 'CLI-101'- กรองแถวก่อน (เหลือ 7 แถว)SUM(ClientName = 'Sam')- เงื่อนไขคืน 1/0, SUM รวมได้ 3 (เจอ Sam 3 ครั้ง)COUNT(*)- นับแถวทั้งหมดในกลุ่ม = 7
เทคนิค Conditional Aggregation ทั่วไป
SELECT
ClientId,
COUNT(*) AS total_rows,
SUM(ClientName = 'Sam') AS count_sam,
SUM(ClientName = 'Chris') AS count_chris,
SUM(ClientName IN ('Sam', 'Chris')) AS count_sam_or_chris,
SUM(ClientAge > 30) AS count_age_over_30,
AVG(ClientAge) AS avg_age
FROM DemoTable1515
GROUP BY ClientId;
ข้อดีของ SUM(condition) vs COUNT(CASE...)
| วิธี | Syntax | ข้อดี |
|---|---|---|
| SUM(condition) | SUM(col = 'val') | สั้น, อ่านง่าย, MySQL Specific |
| COUNT(CASE) | COUNT(CASE WHEN col='val' THEN 1 END) | ANSI Standard, Portable |
| SUM(CASE) | SUM(CASE WHEN col='val' THEN 1 ELSE 0 END) | Standard, ชัดเจน |