Giới thiệu
Để tính tổng tích lũy (running total / cumulative sum) theo thứ tự các hàng, MySQL cho phép sử dụng biến phiên (@variable) trong câu lệnh SELECT.
Ví dụ thực hành
1. Tạo bảng DemoTable809
mysql> CREATE TABLE DemoTable809 (Price INT);
2. Chèn dữ liệu
mysql> INSERT INTO DemoTable809 VALUES (40),(50),(60);
3. Tính running total
mysql> SELECT @currentSum := @currentSum + Price AS RunningTotal
FROM DemoTable809, (SELECT @currentSum := 0) AS init;
4. Kết quả
+--------------+
| RunningTotal |
+--------------+
| 40 |
| 90 |
| 150 |
+--------------+
Giải thích
(SELECT @currentSum := 0) AS initkhởi tạo biến = 0 trước khi quét hàng.- Biểu thức
@currentSum := @currentSum + Pricecập nhật biến và trả về giá trị mới cho mỗi hàng. - Thứ tự hàng ảnh hưởng kết quả → nên dùng
ORDER BYrõ ràng.
Cách hiện đại (MySQL 8.0+): Window Function
SELECT Price, SUM(Price) OVER (ORDER BY Id) AS RunningTotal
FROM DemoTable809;
Cách này chuẩn SQL, dễ đọc, không phụ thuộc thứ tự xử lý bên trong, và hiệu suất tốt hơn.
Lưu ý với biến phiên
- Thứ tự đánh giá biểu thức không được đảm bảo trong các phiên bản cũ → kết quả có thể sai nếu không cẩn thận.
- Không dùng trong
WHERE,GROUP BY,HAVING(chỉ dùng trongSELECTlist). - Khuyến nghị chuyển sang Window Function (
SUM() OVER()) cho MySQL 8.0+.