Tóm tắt
Bài viết hướng dẫn cách sử dụng mệnh đề GROUP BY ... HAVING để tính tổng cột chỉ khi tất cả các giá trị trong nhóm đều không phải NULL. Nếu có bất kỳ giá trị NULL nào, nhóm đó sẽ bị loại bỏ (không xuất hiện trong kết quả).
Cú pháp
SELECT cot_nhom, SUM(cot_tinh_tong)
FROM ten_bang
GROUP BY cot_nhom
HAVING COUNT(cot_tinh_tong) = COUNT(*);
Giải thích: COUNT(cot_tinh_tong) chỉ đếm các giá trị không NULL, trong khi COUNT(*) đếm tất cả hàng. Nếu hai giá trị bằng nhau → không có NULL nào trong nhóm.
Ví dụ minh họa
1. Tạo bảng và chèn dữ liệu
CREATE TABLE SumDemo (
Id INT,
Amount INT
);
INSERT INTO SumDemo VALUES
(1, 200), (2, 100), (2, NULL),
(1, 300), (2, 100), (1, 500);
2. Dữ liệu trong bảng
+------+--------+
| Id | Amount |
+------+--------+
| 1 | 200 |
| 2 | 100 |
| 2 | NULL |
| 1 | 300 |
| 2 | 100 |
| 1 | 500 |
+------+--------+
3. Truy vấn tính tổng có điều kiện
SELECT Id, SUM(Amount)
FROM SumDemo
GROUP BY Id
HAVING COUNT(Amount) = COUNT(*);
4. Kết quả
+------+-------------+
| Id | SUM(Amount) |
+------+-------------+
| 1 | 1000 |
+------+-------------+
Chỉ có Id = 1 được tính tổng (200+300+500=1000) vì Id = 2 chứa giá trị NULL.
Lưu ý quan trọng
- Phương pháp này loại bỏ hoàn toàn nhóm có chứa NULL chứ không trả về NULL cho nhóm đó.
- Nếu cần trả về NULL thay vì loại bỏ nhóm, hãy dùng
CASE WHEN COUNT(cot) = COUNT(*) THEN SUM(cot) ELSE NULL END. - Từ MySQL 8.0, có thể dùng
SUM(cot) FILTER (WHERE cot IS NOT NULL)nhưng hành vi khác (bỏ qua NULL, không loại nhóm).