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

MySQL: ตั้งเงื่อนไข WHERE แบบต่างกันสำหรับแต่ละคอลัมน์ใน SELECT ด้วย CASE

สร้างตารางและข้อมูลตัวอย่าง

mysql> create table DemoTable1988 ( Value1 int, Value2 int, Price int );
mysql> insert into DemoTable1988 values(10,7,500);
mysql> insert into DemoTable1988 values(7,9,400);
mysql> insert into DemoTable1988 values(8,7,200);
mysql> insert into DemoTable1988 values(7,4,300);

ข้อมูลในตาราง

+--------+--------+-------+
| Value1 | Value2 | Price |
+--------+--------+-------+
| 10     | 7      | 500   |
| 7      | 9      | 400   |
| 8      | 7      | 200   |
| 7      | 4      | 300   |
+--------+--------+-------+

Query ใช้ CASE WHEN แทน WHERE แบบแยกคอลัมน์

คำนวณ: ผลรวม Price ที่ Value2=7 ลบด้วย ผลรวม Price ที่ Value1=7

mysql> select sum(case when Value2=7 then Price else 0 end) - sum(case when Value1=7 then Price else 0 end) as Result from DemoTable1988;

ผลลัพธ์

+--------+
| Result |
+--------+
| 0      |
+--------+

การคำนวณ

  • SUM(CASE WHEN Value2=7 THEN Price ELSE 0 END) → แถวที่ 1 (500) + แถวที่ 3 (200) = 700
  • SUM(CASE WHEN Value1=7 THEN Price ELSE 0 END) → แถวที่ 2 (400) + แถวที่ 4 (300) = 700
  • Result = 700 - 700 = 0

ประโยชน์ของเทคนิคนี้

  • คำนวณเงื่อนไขหลายแบบใน Query เดียว (Conditional Aggregation)
  • หลีกเลี่ยงการเขียน Subquery หลายตัวหรือ UNION หลายตัว
  • เหมาะสำหรับรายงาน (Report) ที่ต้องการสรุปข้อมูลหลายมุมมองพร้อมกัน

ตัวอย่างขยาย: รายงานสรุปหลายเงื่อนไข

SELECT 
    SUM(CASE WHEN Value1 > 5 THEN Price ELSE 0 END) AS sum_val1_gt_5,
    SUM(CASE WHEN Value2 < 8 THEN Price ELSE 0 END) AS sum_val2_lt_8,
    COUNT(CASE WHEN Price >= 400 THEN 1 END) AS cnt_price_ge_400
FROM DemoTable1988;