Tính tổng tích lũy (running total) trong MySQL
Sử dụng biến người dùng (user-defined variable) để tính running sum trong một truy vấn SELECT duy nhất.
Tạo bảng và dữ liệu
mysql> CREATE TABLE accumulatedDemo (Value INT); mysql> INSERT INTO accumulatedDemo VALUES (10), (15), (20), (25), (45);
Dữ liệu:
+-------+ | Value | +-------+ | 10 | | 15 | | 20 | | 25 | | 45 | +-------+
Truy vấn tính tích lũy
mysql> SET @previousSum = 0;
mysql> SELECT Value, @previousSum := @previousSum + Value AS AccumulatedColumn
-> FROM accumulatedDemo;
Kết quả:
+-------+-------------------+ | Value | AccumulatedColumn | +-------+-------------------+ | 10 | 10 | | 15 | 25 | | 20 | 45 | | 25 | 70 | | 45 | 115 | +-------+-------------------+
Giải thích
@previousSum := @previousSum + Value: Gán và trả về giá trị mới- Biến
@previousSumgiữ giá trị giữa các hàng - Phải
SET @previousSum = 0trước khi SELECT
Cách hiện đại (MySQL 8.0+ Window Functions)
SELECT Value,
SUM(Value) OVER (ORDER BY Id ROWS UNBOUNDED PRECEDING) AS AccumulatedColumn
FROM accumulatedDemo;
Ưu điểm: Không cần biến, chuẩn SQL, dễ đọc, song song hóa tốt hơn.
Ứng dụng thực tế
- Báo cáo doanh thu tích lũy theo ngày/tháng
- Tính số dư tài khoản sau mỗi giao dịch
- Thống kê tồn kho chạy