Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Thực hiện SUM và SUBTRACTION có điều kiện trong một truy vấn MySQL với CASE

Giới thiệu

Sử dụng biểu thức CASE bên trong hàm tổng hợp SUM() để cộng giá trị khi Status='ACTIVE' và trừ giá trị khi Status='INACTIVE' trong một truy vấn duy nhất.

Ví dụ thực hành

1. Tạo bảng DemoTable866

mysql> CREATE TABLE DemoTable866 (
    Status VARCHAR(100),
    Amount INT
);

2. Chèn dữ liệu

mysql> INSERT INTO DemoTable866 VALUES 
    ('ACTIVE',50),('INACTIVE',70),('INACTIVE',20),('ACTIVE',100),('ACTIVE',200);

3. Tính RemainingAmount = SUM(ACTIVE) - SUM(INACTIVE)

mysql> SELECT SUM(
    CASE 
        WHEN Status = 'ACTIVE'   THEN Amount
        WHEN Status = 'INACTIVE' THEN -Amount
    END
) AS RemainingAmount FROM DemoTable866;

4. Kết quả: (50+100+200) - (70+20) = 350 - 90 = 260

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

Các biến thể

-- Dùng IF (MySQL-specific, ngắn hơn)
SELECT SUM(IF(Status='ACTIVE', Amount, -Amount)) AS RemainingAmount FROM DemoTable866;

-- Tách 2 cột kết quả
SELECT 
    SUM(CASE WHEN Status='ACTIVE' THEN Amount ELSE 0 END) AS TotalActive,
    SUM(CASE WHEN Status='INACTIVE' THEN Amount ELSE 0 END) AS TotalInactive,
    SUM(CASE WHEN Status='ACTIVE' THEN Amount ELSE -Amount END) AS NetAmount
FROM DemoTable866;

-- Có ELSE NULL (mặc định) → bỏ qua hàng không khớp điều kiện
SELECT SUM(CASE WHEN Status='ACTIVE' THEN Amount END) AS ActiveSum FROM DemoTable866;

CASE biểu thức vs CASE statement

  • CASE expression (trong SELECT/WHERE/ORDER BY): Trả về giá trị. Dùng như ví dụ trên.
  • CASE statement (trong stored procedure): Điều khiển luồng (IF/ELSE logic).

Lưu ý

  • CASE chuẩn SQL, portable. IF() chỉ MySQL.
  • Kiểu dữ liệu kết quả của CASE: MySQL suy ra từ các nhánh THEN/ELSE.
  • Index trên Status giúp lọc nhanh, nhưng SUM(CASE...) vẫn full scan (aggregate).
  • Với dữ liệu lớn: cân nhắc materialized view / summary table cập nhật bằng trigger / scheduled job.