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

MySQL: SUM และ SUBTRACTION ในคอลัมน์เดียวตามเงื่อนไข (CASE WHEN)

การรวม/ลบตามเงื่อนไขด้วย CASE WHEN

ใช้ CASE WHEN condition THEN value ELSE other END ภายใน SUM() เพื่อบวกหรือลบตามสถานะ

ตัวอย่าง: ACTIVE = บวก, INACTIVE = ลบ

mysql> create table DemoTable866(
    Status varchar(100),
    Amount int );
Query OK, 0 rows affected (0.63 sec)
mysql> insert into DemoTable866 values('ACTIVE', 50);
mysql> insert into DemoTable866 values('INACTIVE', 70);
mysql> insert into DemoTable866 values('INACTIVE', 20);
mysql> insert into DemoTable866 values('ACTIVE', 100);
mysql> insert into DemoTable866 values('ACTIVE', 200);

คำสั่ง SUM แบบมีเงื่อนไข

mysql> select sum(
    CASE WHEN Status = 'ACTIVE' THEN Amount
         WHEN Status = 'INACTIVE' THEN -Amount
    END
) as RemainingAmount from DemoTable866;

ผลลัพธ์: 50 - 70 - 20 + 100 + 200 = 260

+-----------------+
| RemainingAmount |
+-----------------+
| 260             |
+-----------------+

รูปแบบ CASE WHEN

-- Simple CASE
CASE column WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default END

-- Searched CASE (ใช้ได้กว้างขึ้น)
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default END

การใช้งานอื่นๆ

-- นับจำนวนตามเงื่อนไข
SELECT SUM(CASE WHEN Status = 'ACTIVE' THEN 1 ELSE 0 END) as active_count FROM DemoTable866;

-- แยกคอลัมน์
SELECT 
    SUM(CASE WHEN Status = 'ACTIVE' THEN Amount ELSE 0 END) as total_active,
    SUM(CASE WHEN Status = 'INACTIVE' THEN Amount ELSE 0 END) as total_inactive
FROM DemoTable866;

MySQL 8.0+: FILTER Clause (ไม่รองรับโดยตรง แต่ใช้ CASE ได้)

PostgreSQL มี SUM(amount) FILTER (WHERE status = 'ACTIVE') MySQL ใช้ CASE WHEN แทน

สรุป

ใช้ SUM(CASE WHEN condition THEN value ELSE -value END) คำนวณสุทธิ บวก/ลบ ตามเงื่อนไขในคิวรี่เดียว