การคำนวณ Running Total ด้วย CROSS JOIN
ใช้ CROSS JOIN (SELECT @sum := 0) AS init เพื่อ Initialize Variable แล้วคำนวณสะสมใน SELECT
ตัวอย่าง
mysql> create table DemoTable(Value int);
Query OK, 0 rows affected (1.79 sec)
mysql> insert into DemoTable values(50);
mysql> insert into DemoTable values(20);
mysql> insert into DemoTable values(30);
คำสั่ง Running Total (เรียงตาม Value)
mysql> select t.Value,
(@s := @s + t.Value) as Number
from DemoTable t
cross join (select @s := 0) p
order by t.Value;
ผลลัพธ์:
+-------+--------+
| Value | Number |
+-------+--------+
| 20 | 20 |
| 30 | 50 |
| 50 | 100 |
+-------+--------+
คำอธิบาย
CROSS JOIN (SELECT @s := 0) p- สร้าง Derived Table ที่มี Variable @s = 0@s := @s + t.Value- อัปเดต Variable และคืนค่าใหม่ (Assignment ใน SELECT)ORDER BY t.Value- เรียงก่อนคำนวณ เพื่อให้ Running Total ตามลำดับ Value
MySQL 8.0+: Window Function (แนะนำ)
SELECT
Value,
SUM(Value) OVER (ORDER BY Value) AS running_total
FROM DemoTable;
ให้ผลลัพธ์เดียวกัน แต่เป็นมาตรฐาน อ่านง่าย ไม่ต้องจัดการ Variable
สรุป
MySQL < 8.0: ใช้ CROSS JOIN (SELECT @var := 0) + @var := @var + col MySQL 8.0+: ใช้ SUM() OVER (ORDER BY ...)