Sử dụng CASE kết hợp với hàm tổng hợp SUM() để đếm số lượng giá trị dương và âm trong một cột.
Tạo bảng vote
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Vote INT
-> );
Chèn dữ liệu (giá trị dương = vote up, âm = vote down)
mysql> INSERT INTO DemoTable(Vote) VALUES(-10); mysql> INSERT INTO DemoTable(Vote) VALUES(100); mysql> INSERT INTO DemoTable(Vote) VALUES(45); mysql> INSERT INTO DemoTable(Vote) VALUES(-6); mysql> INSERT INTO DemoTable(Vote) VALUES(-1000); mysql> INSERT INTO DemoTable(Vote) VALUES(450);
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+----+-------+ | Id | Vote | +----+-------+ | 1 | -10 | | 2 | 100 | | 3 | 45 | | 4 | -6 | | 5 | -1000 | | 6 | 450 | +----+-------+
Đếm vote dương và âm
mysql> SELECT
-> SUM(CASE WHEN Vote > 0 THEN 1 ELSE 0 END) AS Number_Of_Positive_Votes,
-> SUM(CASE WHEN Vote < 0 THEN 1 ELSE 0 END) AS Number_Of_Negative_Votes
-> FROM DemoTable;
+--------------------------+--------------------------+ | Number_Of_Positive_Votes | Number_Of_Negative_Votes | +--------------------------+--------------------------+ | 3 | 3 | +--------------------------+--------------------------+
Mở rộng: Tính tổng điểm vote
SELECT
SUM(CASE WHEN Vote > 0 THEN Vote ELSE 0 END) AS Total_Positive_Score,
SUM(CASE WHEN Vote < 0 THEN Vote ELSE 0 END) AS Total_Negative_Score,
SUM(Vote) AS Net_Score
FROM DemoTable;
Cách viết gọn với COUNT()
SELECT
COUNT(CASE WHEN Vote > 0 THEN 1 END) AS Positive_Count,
COUNT(CASE WHEN Vote < 0 THEN 1 END) AS Negative_Count
FROM DemoTable;
COUNT chỉ đếm giá trị không NULL, nên CASE WHEN ... THEN 1 END (mặc định ELSE NULL) hoạt động tương tự.