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

Tính tổng có điều kiện (Conditional SUM) trong MySQL với CASE WHEN

Để tính tổng giá trị dựa trên điều kiện của cột khác (ví dụ: nếu khách hợp lệ thì cộng Price, không thì cộng FinalPrice), dùng SUM() kết hợp biểu thức CASE bên trong.

Tạo bảng và dữ liệu

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Price INT,
    isValidCustomer BOOLEAN,
    FinalPrice INT
);

mysql> INSERT INTO DemoTable (Price, isValidCustomer, FinalPrice) VALUES
(20, FALSE, 40),
(45, TRUE,  10),
(89, TRUE,  50),
(200, FALSE, 100);

Dữ liệu

mysql> SELECT * FROM DemoTable;
+----+-------+-----------------+------------+
| Id | Price | isValidCustomer | FinalPrice |
+----+-------+-----------------+------------+
|  1 |    20 |               0 |         40 |
|  2 |    45 |               1 |         10 |
|  3 |    89 |               1 |         50 |
|  4 |   200 |               0 |        100 |
+----+-------+-----------------+------------+

Truy vấn: Tổng có điều kiện

Logic: isValidCustomer = TRUE (1) -> cộng Price. FALSE (0) -> cộng FinalPrice.

mysql> SELECT SUM(CASE WHEN isValidCustomer = TRUE THEN Price ELSE FinalPrice END) AS TotalPrice 
FROM DemoTable;

Kết quả

+------------+
| TotalPrice |
+------------+
|        274 |
+------------+

Chi tiết tính toán

  • Hàng 1: FALSE -> +40
  • Hàng 2: TRUE -> +45
  • Hàng 3: TRUE -> +89
  • Hàng 4: FALSE -> +100
  • Tổng: 40 + 45 + 89 + 100 = 274

Mở rộng: Nhiều điều kiện, nhiều cột tổng

SELECT 
    SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS paid_total,
    SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS pending_total,
    SUM(CASE WHEN status = 'cancelled' THEN amount ELSE 0 END) AS cancelled_total
FROM orders;

Cách này thay thế nhiều truy vấn riêng lẻ, hiệu năng tốt hơn.