Sử dụng UNION ALL gộp dữ liệu từ nhiều bảng, sau đó SUM() trên tập kết quả chung.
Cú pháp
SELECT SUM(tbl.cột_giá_trị) AS Tổng
FROM (
SELECT cột_giá_trị FROM bảng_1
UNION ALL
SELECT cột_giá_trị FROM bảng_2
UNION ALL
SELECT cột_giá_trị FROM bảng_3
) tbl;
Ví dụ minh họa
Tạo 2 bảng sản phẩm:
mysql> CREATE TABLE Products1 (
-> ProductId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ProductName VARCHAR(20),
-> ProductPrice INT
-> );
mysql> CREATE TABLE Products2 (
-> ProductId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ProductName VARCHAR(20),
-> ProductPrice INT
-> );
Chèn dữ liệu bảng 1:
mysql> INSERT INTO Products1(ProductName, ProductPrice) VALUES
-> ('Product-1', 100), ('Product-2', 200), ('Product-3', 700);
Chèn dữ liệu bảng 2:
mysql> INSERT INTO Products2(ProductName, ProductPrice) VALUES
-> ('Product-1', 500), ('Product-4', 100), ('Product-5', 400);
Tổng giá cả 2 bảng:
mysql> SELECT SUM(tbl.ProductPrice) AS TotalPrice
-> FROM (
-> SELECT ProductPrice FROM Products1
-> UNION ALL
-> SELECT ProductPrice FROM Products2
-> ) tbl;
+------------+ | TotalPrice | +------------+ | 2000 |
Giải thích: 100+200+700 + 500+100+400 = 2000
Tại sao UNION ALL thay vì UNION?
- UNION: Loại bỏ trùng lặp → tốn CPU/MEM so sánh, có thể mất dữ liệu nếu giá trị trùng nhưng là hàng khác nhau
- UNION ALL: Giữ tất cả hàng → nhanh hơn, chính xác cho SUM
Mở rộng: Tổng theo nhóm (GROUP BY) sau UNION ALL
SELECT tbl.ProductName, SUM(tbl.ProductPrice) AS TotalPrice
FROM (
SELECT ProductName, ProductPrice FROM Products1
UNION ALL
SELECT ProductName, ProductPrice FROM Products2
) tbl
GROUP BY tbl.ProductName;
+-------------+------------+ | ProductName | TotalPrice | +-------------+------------+ | Product-1 | 600 | -- 100 + 500 | Product-2 | 200 | | Product-3 | 700 | | Product-4 | 100 | | Product-5 | 400 | +-------------+------------+
Cách khác: VIEW
CREATE VIEW AllProducts AS SELECT ProductName, ProductPrice FROM Products1 UNION ALL SELECT ProductName, ProductPrice FROM Products2; SELECT ProductName, SUM(ProductPrice) FROM AllProducts GROUP BY ProductName;