Sử dụng biến người dùng (user-defined variable) để tính running total / cumulative sum theo thứ tự.
Cú pháp
-- Khởi tạo biến
SET @cumsum := 0;
-- Truy vấn tính cumulative sum
SELECT column1, column2,
(@cumsum := @cumsum + column2) AS cumulative_sum
FROM table_name
ORDER BY column1;
Ví dụ minh họa
mysql> CREATE TABLE CumulativeSumDemo (BookId INT, BookPrice INT); Query OK, 0 rows affected (0.67 sec) mysql> INSERT INTO CumulativeSumDemo VALUES (101,400), (102,500), (103,600), (104,1000); Query OK, 4 rows affected
Tính cumulative sum theo BookId:
mysql> SET @CumulativeSum := 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT BookId, BookPrice,
(@CumulativeSum := @CumulativeSum + BookPrice) AS CumSum
FROM CumulativeSumDemo
ORDER BY BookId;
Kết quả:
+--------+-----------+--------+ | BookId | BookPrice | CumSum | +--------+-----------+--------+ | 101 | 400 | 400 | | 102 | 500 | 900 | | 103 | 600 | 1500 | | 104 | 1000 | 2500 | +--------+-----------+--------+
Cách hiện đại: Window Function (MySQL 8.0+)
SELECT BookId, BookPrice,
SUM(BookPrice) OVER (ORDER BY BookId) AS CumSum
FROM CumulativeSumDemo;
Ưu điểm: chuẩn SQL, không cần biến, dễ đọc, tối ưu tốt hơn.
Lưu ý với biến người dùng
- Thứ tự đánh giá không đảm bảo trong các truy vấn phức tạp (JOIN, subquery). Luôn dùng
ORDER BYtrong cùng cấp SELECT. - Không an toàn cho replication (statement-based).
- Khuyến nghị: dùng Window Function (MySQL 8.0+).