Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

สร้าง Cumulative Sum (Running Total) ใน MySQL ด้วย User Variable


หลักการทำงาน Cumulative Sum

ใช้ User Variable (@variable) เก็บค่าสะสม และอัปเดตทีละแถวตามลำดับที่ต้องการ:

ขั้นตอน

  1. สร้าง Variable และตั้งค่าเริ่มต้น: SET @cumsum := 0;
  2. SELECT พร้อมคำนวณสะสม: @cumsum := @cumsum + column
  3. กำหนด ORDER BY ให้ชัดเจน

ตัวอย่างการใช้งาน

สร้างตารางหนังสือและราคา

CREATE TABLE CumulativeSumDemo (BookId INT, BookPrice INT);
INSERT INTO CumulativeSumDemo VALUES
(101, 400), (102, 500), (103, 600), (104, 1000);

ข้อมูลต้นฉบับ

+--------+-----------+
| BookId | BookPrice |
+--------+-----------+
| 101    | 400       |
| 102    | 500       |
| 103    | 600       |
| 104    | 1000      |
+--------+-----------+

สร้าง Variable และคำนวณ Cumulative Sum

SET @CumulativeSum := 0;

SELECT BookId, BookPrice,
       (@CumulativeSum := @CumulativeSum + BookPrice) AS CumSum
FROM CumulativeSumDemo
ORDER BY BookId;

ผลลัพธ์

+--------+-----------+--------+
| BookId | BookPrice | CumSum |
+--------+-----------+--------+
| 101    | 400       | 400    |
| 102    | 500       | 900    |
| 103    | 600       | 1500   |
| 104    | 1000      | 2500   |
+--------+-----------+--------+

MySQL 8.0+: ใช้ Window Function (แนะนำ)

SELECT BookId, BookPrice,
       SUM(BookPrice) OVER (ORDER BY BookId) AS CumSum
FROM CumulativeSumDemo;

วิธีนี้มาตรฐาน ANSI SQL เร็วกว่า ไม่ต้องใช้ Variable และรองรับ PARTITION BY

กรณี Partition By (เช่น ต่อ Category)

-- User Variable (ยุ่งยาก)
-- Window Function (ง่าย)
SELECT category, BookId, BookPrice,
       SUM(BookPrice) OVER (PARTITION BY category ORDER BY BookId) AS CumSum
FROM books;

คำเตือน User Variable: ลำดับการประมวลผลไม่ได้รับประกันใน Query ซับซ้อน (JOIN, Subquery) ควรใช้ Window Function ใน MySQL 8.0+