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

Tính tổng nếu tất cả hàng không null, ngược lại trả về NULL trong MySQL

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).