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 ý
CASEchuẩ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
Statusgiú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.