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

Tính tổng tích lũy (Running Total) trong MySQL với SUM() OVER

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 SpecificSum là tổng của CustomerValue từ 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.