Giới thiệu
Dùng hàm tổng hợp SUM() kết hợp biểu thức boolean (TRUE=1, FALSE=0) để đếm số lượng 0 và 1 trong một cột tinyint/boolean, hiển thị kết quả trong 2 cột riêng.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
isMarried TINYINT(1)
);
mysql> INSERT INTO DemoTable VALUES (0), (1), (1), (0), (1), (1), (0);
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+-----------+ | isMarried | +-----------+ | 0 | | 1 | | 1 | | 0 | | 1 | | 1 | | 0 | +-----------+
Truy vấn đếm 0 và 1 thành 2 cột
mysql> SELECT
SUM(tbl.isMarried = 1) AS all_one_count,
SUM(tbl.isMarried = 0) AS all_zero_count,
SUM(tbl.isMarried IN (0,1)) AS all_zero_count_and_one_count
FROM DemoTable tbl;
Kết quả
+---------------+----------------+------------------------------+ | all_one_count | all_zero_count | all_zero_count_and_one_count | +---------------+----------------+------------------------------+ | 4 | 3 | 7 | +---------------+----------------+------------------------------+
Giải thích
isMarried = 1trả về 1 (TRUE) hoặc 0 (FALSE).SUM()cộng dồn các giá trị 1/0 → đếm số lần TRUE.IN (0,1)kiểm tra giá trị hợp lệ (loại NULL nếu có).
Cách thay thế: COUNT(IF())
SELECT
COUNT(IF(isMarried = 1, 1, NULL)) AS ones,
COUNT(IF(isMarried = 0, 1, NULL)) AS zeros
FROM DemoTable;
Mở rộng: Pivot table (crosstab) cho nhiều giá trị
SELECT
SUM(status = 'pending') AS pending,
SUM(status = 'approved') AS approved,
SUM(status = 'rejected') AS rejected
FROM orders;