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

แสดงผลรวมเป็น 0 สำหรับค่าที่ไม่มีข้อมูลใน MySQL


ปัญหา

เมื่อใช้ 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