ใช้ CASE WHEN ภายใน SUM() เพื่อคำนวณผลรวมแบบมีเงื่อนไข (Conditional Sum) จากคอลัมน์เดียวกันได้หลายแบบใน Query เดียว
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1794 (
Amount INT
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO DemoTable1794 VALUES(100); mysql> INSERT INTO DemoTable1794 VALUES(80); mysql> INSERT INTO DemoTable1794 VALUES(320);
3. แสดงข้อมูล
mysql> SELECT * FROM DemoTable1794; +--------+ | Amount | +--------+ | 100 | | 80 | | 320 | +--------+
4. Query: SUM ทั้งหมด และ SUM เฉพาะ < 150
mysql> SELECT
SUM(Amount) AS TotalAmount,
SUM(CASE WHEN Amount < 150 THEN Amount ELSE 0 END) AS SecondAmount
FROM DemoTable1794;
5. ผลลัพธ์
+-------------+--------------+ | TotalAmount | SecondAmount | +-------------+--------------+ | 500 | 180 | +-------------+--------------+
การคำนวณ
| Amount | TotalAmount (SUM All) | SecondAmount (CASE < 150) |
|---|---|---|
| 100 | 100 | 100 (< 150) |
| 80 | 80 | 80 (< 150) |
| 320 | 320 | 0 (≥ 150) |
| Total | 500 | 180 |
รูปแบบ CASE WHEN ใน Aggregate Function
SUM(CASE WHEN condition THEN value ELSE 0 END)
THEN value: ค่าที่จะนำไปบวก (ปกติคือคอลัมน์นั้นเอง)ELSE 0: ไม่ตรงเงื่อนไข ให้บวก 0 (ไม่ส่งผลต่อผลรวม)- สามารถใส่
CASE WHENหลายตัวใน SELECT เดียวกันได้
ตัวอย่างขยาย: สรุปหลายเงื่อนไขใน Query เดียว
SELECT
SUM(Amount) AS Total,
SUM(CASE WHEN Amount < 100 THEN Amount ELSE 0 END) AS LessThan100,
SUM(CASE WHEN Amount BETWEEN 100 AND 200 THEN Amount ELSE 0 END) AS Between100_200,
SUM(CASE WHEN Amount > 200 THEN Amount ELSE 0 END) AS GreaterThan200,
COUNT(*) AS TotalRows,
COUNT(CASE WHEN Amount < 100 THEN 1 END) AS CountLessThan100
FROM DemoTable1794;
สรุป
SUM(CASE WHEN ... THEN col ELSE 0 END) เป็นเทคนิคมาตรฐาน (Conditional Aggregation) ใช้คำนวณหลาย Metrics จากคอลัมน์เดียวใน Query เดียว ได้ผลลัพธ์ 1 แถว เร็วและสะดวกกว่า Subquery หลายตัว