Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Đếm có điều kiện trong MySQL: dùng SUM() với biểu thức logic

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.