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

Tổng cột qua nhiều bảng trong MySQL với UNION ALL

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;