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

MySQL คำนวณ SUM 2 แบบจากคอลัมน์ Amount เดียวกันด้วย CASE WHEN

ใช้ 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 |
+-------------+--------------+

การคำนวณ

AmountTotalAmount (SUM All)SecondAmount (CASE < 150)
100100100 (< 150)
808080 (< 150)
3203200 (≥ 150)
Total500180

รูปแบบ 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 หลายตัว