Sử dụng SUM(CASE WHEN ... THEN 1 ELSE 0 END) (conditional aggregation) để đếm theo nhiều điều kiện, mỗi điều kiện một cột.
Ví dụ minh họa
Tạo bảng:
mysql> CREATE TABLE DemoTable1485 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(20), StudentSubject VARCHAR(20)
);
Chèn dữ liệu (Chris học MySQL, Java; Robert học MongoDB 2 lần):
mysql> INSERT INTO DemoTable1485(StudentName, StudentSubject) VALUES('Chris', 'MySQL'), ('Robert', 'MongoDB'), ('Robert', 'MongoDB'), ('Chris', 'Java');
Xem dữ liệu:
mysql> SELECT * FROM DemoTable1485;
+-----------+-------------+----------------+ | StudentId | StudentName | StudentSubject | +-----------+-------------+----------------+ | 1 | Chris | MySQL | | 2 | Robert | MongoDB | | 3 | Robert | MongoDB | | 4 | Chris | Java | +-----------+-------------+----------------+
Đếm số môn học của mỗi sinh viên theo từng môn (pivot/crosstab):
mysql> SELECT StudentSubject,
SUM(CASE WHEN StudentName = 'Chris' THEN 1 ELSE 0 END) AS Chris_Count,
SUM(CASE WHEN StudentName = 'Robert' THEN 1 ELSE 0 END) AS Robert_Count
FROM DemoTable1485
GROUP BY StudentSubject;
Kết quả:
+----------------+-------------+--------------+ | StudentSubject | Chris_Count | Robert_Count | +----------------+-------------+--------------+ | MySQL | 1 | 0 | | MongoDB | 0 | 2 | | Java | 1 | 0 | +----------------+-------------+--------------+
Mở rộng: MySQL 8.0 hỗ trợ COUNT(*) FILTER (WHERE ...) (chuẩn SQL) nhưng MySQL chưa hỗ trợ. Dùng SUM(...) như trên là cách chuẩn.