เมื่อต้องการนับจำนวนค่าบวก (Positive) และค่าลบ (Negative) ในคอลัมน์ตัวเลข สามารถใช้ CASE WHEN ร่วมกับ SUM() ได้อย่างมีประสิทธิภาพ โดยแปลงเงื่อนไขเป็น 1 และ 0 แล้วค่อยรวมกัน
สร้างตารางและข้อมูล
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Vote int
);
mysql> insert into DemoTable(Vote) values(-10),(100),(45),(-6),(-1000),(450);
ข้อมูลในตาราง
+----+-------+ | Id | Vote | +----+-------+ | 1 | -10 | | 2 | 100 | | 3 | 45 | | 4 | -6 | | 5 | -1000 | | 6 | 450 | +----+-------+
คำสั่งนับโหวตบวกและลบ
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 | +--------------------------+--------------------------+
หลักการทำงาน
CASE WHEN Vote > 0 THEN 1 ELSE 0 END - แปลงโหวตบวกเป็น 1, ที่เหลือเป็น 0SUM() - รวมค่า 1 ทั้งหมด = จำนวนโหวตบวก- ทำซ้ำสำหรับโหวตลบ
ขยายความสามารถ: นับศูนย์และรวมทั้งหมด
SELECT
SUM(CASE WHEN Vote > 0 THEN 1 ELSE 0 END) AS positive_votes,
SUM(CASE WHEN Vote < 0 THEN 1 ELSE 0 END) AS negative_votes,
SUM(CASE WHEN Vote = 0 THEN 1 ELSE 0 END) AS zero_votes,
COUNT(*) AS total_votes
FROM DemoTable;
ทางเลือก: Conditional Aggregates (MySQL 8.0+)
SELECT
COUNT(*) FILTER (WHERE Vote > 0) AS positive_votes,
COUNT(*) FILTER (WHERE Vote < 0) AS negative_votes,
COUNT(*) FILTER (WHERE Vote = 0) AS zero_votes
FROM DemoTable;
หมายเหตุ: MySQL ยังไม่รองรับ FILTER clause ตรงๆ ต้องใช้ CASE WHEN
ประยุกต์ใช้: คะแนนสุทธิ (Net Score)
SELECT SUM(Vote) AS net_score FROM DemoTable;