Sử dụng COUNT() kết hợp IF() hoặc CASE WHEN để đếm số hàng thỏa mãn điều kiện cụ thể.
Cú pháp
SELECT
COUNT(*) AS Tổng_số_hàng,
COUNT(IF(cột = giá_trị, 1, NULL)) AS Số_lượng_giá_trị
FROM tên_bảng;
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE countValueDemo (
-> ShippingDatetime DATETIME,
-> FirstValue INT,
-> SecondValue INT
-> );
Query OK, 0 rows affected (1.35 sec)
Chèn dữ liệu (có giá trị NULL):
mysql> INSERT INTO countValueDemo VALUES
-> ('2019-01-23', 1, 2),
-> ('2017-02-21', NULL, 2),
-> ('2016-04-12', 1, NULL);
Xem dữ liệu:
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 | +---------------------+------------+-------------+
Đếm: tổng hàng, số hàng FirstValue=1, số hàng SecondValue=2:
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 | +---------------------+----------+----------------------------------------+-----------------------------------------+
Giải thích
COUNT(*): đếm tất cả hàng (3 hàng)COUNT(IF(FirstValue = 1, 1, NULL)): IF trả về 1 khi đúng, NULL khi sai. COUNT chỉ đếm giá trị KHÔNG NULL → kết quả 2- Tương tự cho SecondValue = 2 → kết quả 2
Cách viết hiện đại hơn (MySQL 8.0+)
SELECT
COUNT(*) AS total,
COUNT(CASE WHEN FirstValue = 1 THEN 1 END) AS first_eq_1,
COUNT(CASE WHEN SecondValue = 2 THEN 1 END) AS second_eq_2
FROM countValueDemo;
Đếm nhiều giá trị khác nhau cùng lúc
SELECT
FirstValue,
COUNT(*) AS cnt
FROM countValueDemo
GROUP BY FirstValue;
+------------+-----+ | FirstValue | cnt | +------------+-----+ | NULL | 1 | | 1 | 2 | +------------+-----+