Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

นับโหวตบวกและลบใน MySQL ด้วย CASE WHEN และ SUM()

เมื่อต้องการนับจำนวนค่าบวก (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, ที่เหลือเป็น 0
  • SUM() - รวมค่า 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;