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

MySQL: SELECT หลาย SUM แยกคอลัมน์ด้วย CASE WHEN

เมื่อต้องการคำนวณ 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 ถ้าเงื่อนไขจริง, ไม่งั้น NULL
  • SUM() - ข้าม 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