เมื่อต้องการนับจำนวนค่าเฉพาะ (เช่น Yes/No) ในคอลัมน์ ENUM หรือ VARCHAR ที่มีค่าซ้ำกันในหลายแถว สามารถใช้ SUM() ร่วมกับเงื่อนไขแบบ Boolean ได้ โดย MySQL จะแปลง TRUE เป็น 1 และ FALSE เป็น 0 อัตโนมัติ
ตัวอย่างการใช้งาน
สร้างตารางสถานะสมรส:
mysql> CREATE TABLE DemoTable1430 (
-> EmployeeId INT,
-> isMarried ENUM('YES', 'NO')
-> );
เพิ่มข้อมูล (EmployeeId 1001 มี 4 ระเบียน):
mysql> INSERT INTO DemoTable1430 VALUES (1001, 'Yes'); mysql> INSERT INTO DemoTable1430 VALUES (1001, 'No'); mysql> INSERT INTO DemoTable1430 VALUES (1001, 'Yes'); mysql> INSERT INTO DemoTable1430 VALUES (1001, 'Yes');
ดูข้อมูล:
mysql> SELECT * FROM DemoTable1430; +------------+-----------+ | EmployeeId | isMarried | +------------+-----------+ | 1001 | YES | | 1001 | NO | | 1001 | YES | | 1001 | YES | +------------+-----------+
นับจำนวน Yes และ No แยกตาม EmployeeId:
mysql> SELECT EmployeeId,
-> SUM(isMarried = 'Yes') AS NumberOfMarried,
-> SUM(isMarried = 'No') AS NumberOfUnMarried
-> FROM DemoTable1430
-> GROUP BY EmployeeId;
ผลลัพธ์:
+------------+-----------------+-------------------+ | EmployeeId | NumberOfMarried | NumberOfUnMarried | +------------+-----------------+-------------------+ | 1001 | 3 | 1 | +------------+-----------------+-------------------+
หลักการทำงาน
isMarried = 'Yes'คืนค่า 1 (TRUE) หรือ 0 (FALSE)- SUM() รวมค่า 1/0 เข้าด้วยกัน = จำนวนครั้งที่เป็นจริง
- GROUP BY แยกนับตาม EmployeeId
วิธีทางเลือก: ใช้ CASE WHEN
SELECT EmployeeId,
SUM(CASE WHEN isMarried = 'Yes' THEN 1 ELSE 0 END) AS NumberOfMarried,
SUM(CASE WHEN isMarried = 'No' THEN 1 ELSE 0 END) AS NumberOfUnMarried
FROM DemoTable1430
GROUP BY EmployeeId;
ทั้งสองวิธีให้ผลลัพธ์เหมือนกัน วิธีแรกสั้นกว่า วิธีที่สองอ่านง่ายกว่าและยืดหยุ่นกว่า (รองรับเงื่อนไขซับซ้อน)
การประยุกต์ใช้
- นับสถานะออเดอร์: Pending, Shipped, Delivered, Cancelled
- สถิติการเข้าชม: Unique vs Returning visitors
- ผลสอบ: Pass/Fail ตามเกณฑ์
- แบบสำรวจ: Agree/Neutral/Disagree