แนวคิด
ใช้ COUNT(IF(condition, 1, NULL)) เพื่อนับเฉพาะแถวที่ตรงเงื่อนไข COUNT จะไม่นับ NULL
รูปแบบคำสั่ง
SELECT COUNT(*), COUNT(IF(FirstValue = 1, 1, NULL)) AS count_first_1, COUNT(IF(SecondValue = 2, 1, NULL)) AS count_second_2 FROM yourTable;
ตัวอย่างครบถ้วน
1. สร้างตาราง
mysql> create table countValueDemo
-> (
-> ShippingDatetime datetime,
-> FirstValue int,
-> SecondValue int
-> );
Query OK, 0 rows affected (1.35 sec)
2. เพิ่มข้อมูล (มี NULL ปนอยู่)
mysql> insert into countValueDemo values('2019-01-23',1,2);
Query OK, 1 row affected (0.24 sec)
mysql> insert into countValueDemo values('2017-02-21',NULL,2);
Query OK, 1 row affected (0.13 sec)
mysql> insert into countValueDemo values('2016-04-12',1,NULL);
Query OK, 1 row affected (0.19 sec)
3. ดูข้อมูล
mysql> select * from countValueDemo;
+---------------------+------------+-------------+ | ShippingDatetime | FirstValue | SecondValue | +---------------------+------------+-------------+ | 2019-01-23 00:00:00 | 1 | 2 | | 2017-02-21 00:00:00 | NULL | 2 | | 2016-04-12 00:00:00 | 1 | NULL | +---------------------+------------+-------------+
4. Query นับตามเงื่อนไข
mysql> SELECT ShippingDatetime,
-> COUNT(*),
-> COUNT(IF(FirstValue = 1, 1, NULL)),
-> COUNT(IF(SecondValue = 2, 1, NULL))
-> FROM countValueDemo;
+---------------------+----------+----------------------------------------+-----------------------------------------+ | ShippingDatetime | COUNT(*) | COUNT(IF(FirstValue = 1, 1, NULL)) | COUNT(IF(SecondValue = 2, 1, NULL)) | +---------------------+----------+----------------------------------------+-----------------------------------------+ | 2019-01-23 00:00:00 | 3 | 2 | 2 | +---------------------+----------+----------------------------------------+-----------------------------------------+
วิธีอื่นที่ทันสมัยกว่า (MySQL 8.0+)
ใช้ SUM กับ Boolean Expression
SELECT COUNT(*) AS total, SUM(FirstValue = 1) AS count_first_1, SUM(SecondValue = 2) AS count_second_2 FROM countValueDemo;
ใช้ COUNT กับ CASE WHEN
SELECT COUNT(*) AS total, COUNT(CASE WHEN FirstValue = 1 THEN 1 END) AS count_first_1, COUNT(CASE WHEN SecondValue = 2 THEN 1 END) AS count_second_2 FROM countValueDemo;
ขยาย: นับหลายเงื่อนไขพร้อมกัน
SELECT
COUNT(*) AS total,
SUM(status = 'active') AS active_count,
SUM(status = 'pending') AS pending_count,
SUM(status = 'cancelled') AS cancelled_count,
SUM(status NOT IN ('active','pending','cancelled')) AS other_count
FROM orders;
สรุป: SUM(condition) ทันสมัยกว่า อ่านง่ายกว่า และทำงานได้เร็วเท่ากัน