หลักการทำงาน Cumulative Sum
ใช้ User Variable (@variable) เก็บค่าสะสม และอัปเดตทีละแถวตามลำดับที่ต้องการ:
ขั้นตอน
- สร้าง Variable และตั้งค่าเริ่มต้น:
SET @cumsum := 0; - SELECT พร้อมคำนวณสะสม:
@cumsum := @cumsum + column - กำหนด
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+