Khi cần đếm số lượng bản ghi thỏa mãn các điều kiện phức tạp khác nhau cho từng nhóm, sử dụng CASE WHEN bên trong hàm SUM().
Tạo bảng điểm sinh viên
mysql> CREATE TABLE DemoTable (
-> StudentMarks INT,
-> IsValid TINYINT(1)
-> );
Query OK, 0 rows affected (0.68 sec)
mysql> INSERT INTO DemoTable VALUES(45, 0); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO DemoTable VALUES(78, 1); Query OK, 1 row affected (0.26 sec) mysql> INSERT INTO DemoTable VALUES(45, 1); Query OK, 1 row affected (0.31 sec) mysql> INSERT INTO DemoTable VALUES(78, 1); Query OK, 1 row affected (0.22 sec) mysql> INSERT INTO DemoTable VALUES(45, 0); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO DemoTable VALUES(82, 1); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO DemoTable VALUES(62, 1); Query OK, 1 row affected (0.14 sec)
Truy vấn đếm có điều kiện phức hợp
Đếm: Nếu điểm = 45 thì chỉ tính khi IsValid = 1, ngược lại tính tất cả.
mysql> SELECT StudentMarks,
-> SUM(CASE
-> WHEN StudentMarks = 45 THEN CASE WHEN IsValid = 1 THEN 1 ELSE 0 END
-> ELSE 1
-> END) AS Freq
-> FROM DemoTable
-> GROUP BY StudentMarks;
Kết quả:
+--------------+------+ | StudentMarks | Freq | +--------------+------+ | 45 | 1 | | 78 | 2 | | 82 | 1 | | 62 | 1 | +--------------+------+ 4 rows in set (0.00 sec)
Giải thích: Với điểm 45 có 3 bản ghi nhưng chỉ 1 bản ghi IsValid=1, nên Freq = 1. Các điểm khác đếm tất cả bản ghi.