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

Hiển thị hàng tổng cộng (SUM) ở dòng cuối bảng với UNION trong MySQL

Sử dụng UNION để nối kết quả truy vấn chi tiết với truy vấn tổng hợp, tạo hiệu ứng "dòng tổng" ở cuối.

Cú pháp

(SELECT cột1, cột2 FROM tên_bảng)
UNION
(SELECT 'Tổng cộng' AS cột1, SUM(cột2) FROM tên_bảng);

Ví dụ minh họa

Tạo bảng điểm sinh viên:

mysql> CREATE TABLE showSumInLastRowDemo (
    -> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName VARCHAR(20),
    -> StudentMarks INT
    -> );
Query OK, 0 rows affected (0.69 sec)

Chèn dữ liệu (có trùng tên):

mysql> INSERT INTO showSumInLastRowDemo(StudentName, StudentMarks) VALUES
    -> ('John', 56), ('John', 87), ('John', 52), ('Carol', 97),
    -> ('Larry', 75), ('Larry', 98), ('Carol', 73);

Xem dữ liệu gốc:

mysql> SELECT * FROM showSumInLastRowDemo;
+-----------+-------------+--------------+
| StudentId | StudentName | StudentMarks |
+-----------+-------------+--------------+
| 1         | John        | 56           |
| 2         | John        | 87           |
| 3         | John        | 52           |
| 4         | Carol       | 97           |
| 5         | Larry       | 75           |
| 6         | Larry       | 98           |
| 7         | Carol       | 73           |
+-----------+-------------+--------------+

Hiển thị chi tiết + dòng tổng ở cuối:

mysql> (SELECT StudentName, StudentMarks FROM showSumInLastRowDemo)
    -> UNION
    -> (SELECT 'TotalMarksOfAllStudent' AS StudentName, SUM(StudentMarks) AS StudentMarks 
    ->  FROM showSumInLastRowDemo);
+------------------------+--------------+
| StudentName            | StudentMarks |
+------------------------+--------------+
| John                   | 56           |
| John                   | 87           |
| John                   | 52           |
| Carol                  | 97           |
| Larry                  | 75           |
| Larry                  | 98           |
| Carol                  | 73           |
| TotalMarksOfAllStudent | 538          |
+------------------------+--------------+

Lưu ý quan trọng

  • UNION loại bỏ trùng lặp → nếu có hàng dữ liệu trùng hệt với hàng tổng, sẽ bị ẩn. Dùng UNION ALL để giữ tất cả.
  • Số cột và kiểu dữ liệu của 2 SELECT phải khớp nhau
  • Để dòng tổng luôn ở cuối, có thể thêm cột sắp xếp ảo:
    SELECT 1 AS sort_order, StudentName, StudentMarks FROM ...
    UNION ALL
    SELECT 2, 'Total', SUM(StudentMarks) FROM ...
    ORDER BY sort_order;

Cách chuyên nghiệp hơn: WITH ROLLUP (MySQL)

SELECT 
    COALESCE(StudentName, 'Tổng cộng') AS StudentName,
    SUM(StudentMarks) AS TotalMarks
FROM showSumInLastRowDemo
GROUP BY StudentName WITH ROLLUP;

Tự động tạo dòng tổng cho từng nhóm và tổng toàn bộ.