แนวคิด
ใช้ SUM(condition) หรือ COUNT(CASE...) ภายใน GROUP BY เพื่อเช็คว่าค่าหนึ่งๆ ปรากฏในกลุ่มหรือไม่
หลักการ
SUM(UserName = 'David')→ นับจำนวนแถวในกลุ่มที่ UserName = 'David'- ถ้า > 0 = มีอยู่, = 0 = ไม่มี
- wrap ด้วย IF() เพื่อได้ YES/NO
ตัวอย่างครบถ้วน
1. สร้างตาราง
mysql> create table GroupbygroupDemo
-> (
-> UserId int,
-> UserName varchar(20)
-> );
Query OK, 0 rows affected (1.48 sec)
2. เพิ่มข้อมูล
mysql> insert into GroupbygroupDemo values(10,'John'); Query OK, 1 row affected (0.14 sec) mysql> insert into GroupbygroupDemo values(10,'Carol'); Query OK, 1 row affected (0.08 sec) mysql> insert into GroupbygroupDemo values(10,'Carol'); Query OK, 1 row affected (0.12 sec) mysql> insert into GroupbygroupDemo values(20,'David'); Query OK, 1 row affected (0.17 sec) mysql> insert into GroupbygroupDemo values(30,'John'); Query OK, 1 row affected (0.12 sec) mysql> insert into GroupbygroupDemo values(30,'David'); Query OK, 1 row affected (0.20 sec) mysql> insert into GroupbygroupDemo values(30,'Mike'); Query OK, 1 row affected (0.16 sec)
3. ดูข้อมูล
mysql> select * from GroupbygroupDemo;
+--------+----------+ | UserId | UserName | +--------+----------+ | 10 | John | | 10 | Carol | | 10 | Carol | | 20 | David | | 30 | John | | 30 | David | | 30 | Mike | +--------+----------+
4. เช็คว่าแต่ละ UserId กลุ่มมี 'David' หรือไม่
mysql> select UserId,
-> if(sum(UserName = 'David'), 'YES', 'NO') as Has_David
-> from GroupbygroupDemo
-> group by UserId;
+--------+-----------+ | UserId | Has_David | +--------+-----------+ | 10 | NO | | 20 | YES | | 30 | YES | +--------+-----------+
วิธีอื่น: ใช้ COUNT + CASE
SELECT UserId,
CASE WHEN COUNT(CASE WHEN UserName = 'David' THEN 1 END) > 0
THEN 'YES' ELSE 'NO' END AS Has_David
FROM GroupbygroupDemo
GROUP BY UserId;
ขยาย: เช็คหลายค่าพร้อมกัน
SELECT UserId,
MAX(CASE WHEN UserName = 'David' THEN 1 ELSE 0 END) AS has_david,
MAX(CASE WHEN UserName = 'John' THEN 1 ELSE 0 END) AS has_john,
MAX(CASE WHEN UserName = 'Mike' THEN 1 ELSE 0 END) AS has_mike
FROM GroupbygroupDemo
GROUP BY UserId;
+--------+-----------+----------+----------+ | UserId | has_david | has_john | has_mike | +--------+-----------+----------+----------+ | 10 | 0 | 1 | 0 | | 20 | 1 | 0 | 0 | | 30 | 1 | 1 | 1 | +--------+-----------+----------+----------+
ประยุกต์: Conditional Aggregation
SELECT department, COUNT(*) AS total, SUM(gender = 'F') AS female_count, SUM(salary > 50000) AS high_salary_count FROM employees GROUP BY department;
สรุป: SUM(boolean_expression) = จำนวนแถวที่ตรงเงื่อนไขในแต่ละกลุ่ม ใช้ได้หลากหลาย