Để 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.