เมื่อต้องการคำนวณ SUM แยกตามเงื่อนไข และแสดงผลในคอลัมน์แยกกัน ใช้ CASE WHEN ภายใน SUM() (Conditional Aggregation)
รูปแบบคำสั่ง
SELECT
SUM(CASE WHEN condition1 THEN value_column END) AS alias1,
SUM(CASE WHEN condition2 THEN value_column END) AS alias2,
SUM(CASE WHEN condition3 THEN value_column END) AS alias3
FROM table_name;
CASE WHEN condition THEN value END- คืนvalueถ้าเงื่อนไขจริง, ไม่งั้นNULLSUM()- ข้าม NULL อัตโนมัติ จึงรวมเฉพาะแถวที่ตรงเงื่อนไข
ตัวอย่างการใช้งาน
1. สร้างตารางคะแนนนักกีฬา
CREATE TABLE selectMultipleSumDemo (
Id INT NOT NULL AUTO_INCREMENT,
PlayerName VARCHAR(20),
PlayerScore INT,
PRIMARY KEY (Id)
);
INSERT INTO selectMultipleSumDemo (PlayerName, PlayerScore) VALUES
('Maxwell', 89), ('Ricky', 98), ('Maxwell', 96),
('Ricky', 78), ('Maxwell', 51), ('Ricky', 89),
('David', 56), ('David', 65);
ข้อมูลในตาราง:
+----+------------+-------------+
| Id | PlayerName | PlayerScore |
+----+------------+-------------+
| 1 | Maxwell | 89 |
| 2 | Ricky | 98 |
| 3 | Maxwell | 96 |
| 4 | Ricky | 78 |
| 5 | Maxwell | 51 |
| 6 | Ricky | 89 |
| 7 | David | 56 |
| 8 | David | 65 |
+----+------------+-------------+
2. คำนวณ SUM แยกต่อ Player
SELECT
SUM(CASE WHEN PlayerName = 'Maxwell' THEN PlayerScore END) AS 'MAXWELL TOTAL SCORE',
SUM(CASE WHEN PlayerName = 'Ricky' THEN PlayerScore END) AS 'RICKY TOTAL SCORE',
SUM(CASE WHEN PlayerName = 'David' THEN PlayerScore END) AS 'DAVID TOTAL SCORE'
FROM selectMultipleSumDemo;
ผลลัพธ์:
+---------------------+-------------------+-------------------+
| MAXWELL TOTAL SCORE | RICKY TOTAL SCORE | DAVID TOTAL SCORE |
+---------------------+-------------------+-------------------+
| 236 | 265 | 121 |
+---------------------+-------------------+-------------------+
คำนวณ: Maxwell = 89+96+51=236, Ricky = 98+78+89=265, David = 56+65=121 ✓
การใช้งานขั้นสูง
รวม COUNT และ SUM พร้อมกัน
SELECT
SUM(CASE WHEN PlayerName = 'Maxwell' THEN 1 END) AS maxwell_games,
SUM(CASE WHEN PlayerName = 'Maxwell' THEN PlayerScore END) AS maxwell_total,
SUM(CASE WHEN PlayerName = 'Ricky' THEN 1 END) AS ricky_games,
SUM(CASE WHEN PlayerName = 'Ricky' THEN PlayerScore END) AS ricky_total
FROM selectMultipleSumDemo;
ใช้กับ GROUP BY (Pivot Table)
SELECT
GameDate,
SUM(CASE WHEN PlayerName = 'Maxwell' THEN PlayerScore END) AS Maxwell,
SUM(CASE WHEN PlayerName = 'Ricky' THEN PlayerScore END) AS Ricky
FROM scores
GROUP BY GameDate;
Dynamic Pivot (MySQL 8.0+)
-- ต้องใช้ Prepared Statement สร้างคอลัมน์ไดนามิก
SET @sql = (
SELECT GROUP_CONCAT(
DISTINCT CONCAT('SUM(CASE WHEN PlayerName = ''', PlayerName, ''' THEN PlayerScore END) AS `', PlayerName, '`')
)
FROM selectMultipleSumDemo
);
SET @sql = CONCAT('SELECT ', @sql, ' FROM selectMultipleSumDemo');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
สรุป
SUM(CASE WHEN condition THEN column END) เป็นเทคนิค Conditional Aggregation มาตรฐานสำหรับ Pivot/Reporting ใน SQL ทำงานได้ในทุก Database ไม่ใช่แค่ MySQL