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