ปัญหา
เมื่อใช้ Aggregate function เช่น SUM() กับเงื่อนไข หากไม่มีแถวที่ตรงเงื่อนไข ผลลัพธ์จะเป็น NULL ไม่ใช่ 0 ซึ่งอาจทำให้การนำไปคำนวณต่อหรือแสดงผลมีปัญหา
วิธีแก้: ใช้ SUM() กับ Boolean Expression
ใน MySQL ค่า TRUE = 1, FALSE = 0 ดังนั้น SUM(condition) จะนับจำนวนแถวที่ตรงเงื่อนไข และคืนค่า 0 หาไม่มีแถวไหนตรง
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable (
-> Status VARCHAR(20)
-> );
Query OK, 0 rows affected (1.22 sec)
2. เพิ่มข้อมูล (มีแค่ 'active')
mysql> INSERT INTO DemoTable VALUES('active');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable VALUES('active');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable VALUES('active');
Query OK, 1 row affected (0.30 sec)
mysql> INSERT INTO DemoTable VALUES('active');
Query OK, 1 row affected (0.18 sec)
3. นับจำนวน active และ inactive พร้อมกัน
mysql> SELECT
-> SUM(Status = 'active') AS CountOfActive,
-> SUM(Status = 'inactive') AS CountOfInActive
-> FROM DemoTable;
ผลลัพธ์:
+---------------+-----------------+ | CountOfActive | CountOfInActive | +---------------+-----------------+ | 4 | 0 | +---------------+-----------------+ 1 row in set (0.30 sec)
เทคนิคเพิ่มเติม
ใช้ COUNT() กรองเงื่อนไข
SELECT
COUNT(CASE WHEN Status = 'active' THEN 1 END) AS ActiveCount,
COUNT(CASE WHEN Status = 'inactive' THEN 1 END) AS InactiveCount
FROM DemoTable;
ใช้ COUNT() กับ IF()
SELECT
COUNT(IF(Status = 'active', 1, NULL)) AS ActiveCount,
COUNT(IF(Status = 'inactive', 1, NULL)) AS InactiveCount
FROM DemoTable;
สรุปความแตกต่าง
| วิธี | ผลลัพธ์เมื่อไม่มีข้อมูล | เหมาะสำหรับ |
|---|---|---|
| SUM(condition) | 0 | นับจำนวน (นิยมใช้) |
| COUNT(CASE...) | 0 | ซับซ้อนกว่า แต่ยืดหยุ่น |
| COUNT(column) | 0 | นับค่า Non-NULL |
| SUM(column) | NULL | รวมค่าตัวเลข |
กรณีการใช้งานจริง
- Dashboard แสดงสถิติสถานะต่างๆ (Active/Inactive/Pending)
- รายงานยอดขายตามหมวดหมู่ (แสดง 0 หากไม่มียอด)
- นับจำนวน Error/Warning/Info ใน Log
- Pivot table แบบ Dynamic