Từ MySQL 8.0, bạn có thể sử dụng hàm cửa sổ (Window Function) SUM() OVER (ORDER BY ...) để tính tổng tích lũy (running total) theo thứ tự某 cột, rất hữu ích cho báo cáo tài chính, tồn kho, v.v.
Tạo bảng và dữ liệu mẫu
mysql> CREATE TABLE DemoTable (
CustomerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerValue INT
);
mysql> INSERT INTO DemoTable (CustomerValue) VALUES
(10), (20), (30), (40);
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+------------+---------------+
| CustomerId | CustomerValue |
+------------+---------------+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
+------------+---------------+
Truy vấn tính tổng tích lũy theo CustomerId
mysql> SELECT CustomerId,
SUM(CustomerValue) OVER (ORDER BY CustomerId) AS SpecificSum
FROM DemoTable;
Kết quả
+------------+-------------+
| CustomerId | SpecificSum |
+------------+-------------+
| 1 | 10 |
| 2 | 30 |
| 3 | 60 |
| 4 | 100 |
+------------+-------------+
Giải thích
OVER (ORDER BY CustomerId): Xác định cửa sổ bao gồm tất cả các hàng từ đầu đến hàng hiện tại theo thứ tựCustomerId.- Kết quả cột
SpecificSumlà tổng củaCustomerValuetừ hàng 1 đến hàng hiện tại.
Mở rộng: Bạn có thể thêm PARTITION BY để tính tổng tích lũy riêng cho từng nhóm (ví dụ: theo khu vực, loại sản phẩm).
SUM(CustomerValue) OVER (PARTITION BY Region ORDER BY CustomerId)
Tính năng này chỉ khả dụng từ MySQL 8.0 trở lên. Với phiên bản cũ, cần dùng biến người dùng (user variables) hoặc self-join phức tạp hơn.