Trong MySQL, biểu thức logic (so sánh) trả về 1 (TRUE) hoặc 0 (FALSE). Do đó, **SUM(bieu_thuc_logic) đếm số hàng thỏa mãn điều kiện** – đây là kỹ thuật "đếm có điều kiện" phổ biến và hiệu quả.
Cú pháp
SELECT
cot_nhom,
SUM(cot = 'gia_tri') AS so_luong_khop,
COUNT(*) AS tong_so_hang
FROM ten_bang
WHERE dieu_kien_nhom
GROUP BY cot_nhom;
Ví dụ minh họa
Bảng khách hàng (ClientId trùng lặp, tên 'Sam' xuất hiện nhiều lần):
mysql> CREATE TABLE DemoTable1515 (ClientId VARCHAR(10), ClientName VARCHAR(20));
mysql> INSERT INTO DemoTable1515 VALUES
-> ('CLI-101','Chris'), ('CLI-110','David'), ('CLI-101','Bob'),
-> ('CLI-101','Sam'), ('CLI-101','Sam'), ('CLI-101','Mike'),
-> ('CLI-130','Mike'), ('CLI-101','Chris'), ('CLI-101','Sam');
Đếm: trong nhóm ClientId='CLI-101', bao nhiêu tên 'Sam' và tổng số hàng:
mysql> SELECT ClientId,
-> SUM(ClientName = 'Sam') AS NameOn101Id,
-> COUNT(*) AS TotalNameOn101
-> FROM DemoTable1515
-> WHERE ClientId = 'CLI-101';
Kết quả:
+----------+-------------+----------------+ | ClientId | NameOn101Id | TotalNameOn101 | +----------+-------------+----------------+ | CLI-101 | 3 | 7 | +----------+-------------+----------------+
Giải thích: 7 hàng CLI-101, trong đó 3 hàng ClientName = 'Sam'.
Mở rộng: Đếm nhiều điều kiện cùng lúc
SELECT
ClientId,
SUM(ClientName = 'Sam') AS cnt_Sam,
SUM(ClientName = 'Chris') AS cnt_Chris,
SUM(ClientName IN ('Bob','Mike')) AS cnt_Bob_Mike,
COUNT(*) AS total
FROM DemoTable1515
GROUP BY ClientId;
So sánh với COUNT(CASE...)
Cách cũ (chuẩn SQL):
COUNT(CASE WHEN ClientName = 'Sam' THEN 1 END)
Cách MySQL native (ngắn gọn, nhanh):
SUM(ClientName = 'Sam')
Cả hai cho kết quả giống nhau. MySQL khuyến khích dùng SUM(... = ...) cho đơn giản.