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

Tính tổng tích lũy (running total) cột trong MySQL với biến phiên (session variable)

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 init khởi tạo biến = 0 trước khi quét hàng.
  • Biểu thức @currentSum := @currentSum + Price cậ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 BY rõ 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 trong SELECT list).
  • Khuyến nghị chuyển sang Window Function (SUM() OVER()) cho MySQL 8.0+.