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

Tạo cột tổng cộng dồn (Cumulative Sum) trong MySQL


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 BY trong cùng cấp SELECT.
  • Không an toàn cho replication (statement-based).
  • Khuyến nghị: dùng Window Function (MySQL 8.0+).