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

คำนวณค่าสะสมจากคอลัมน์อื่นด้วย User Variable ใน MySQL

การเตรียมข้อมูล

mysql> CREATE TABLE DemoTable1868 (Value INT);

mysql> INSERT INTO DemoTable1868 VALUES(10), (20), (30), (40);

คำนวณ Running Total (ค่าสะสม)

mysql> SELECT 
    Value,
    (@iterator := Value + @iterator) AS SecondColumn
    FROM DemoTable1868, (SELECT @iterator := 0) tbl;

ผลลัพธ์:

+-------+--------------+
| Value | SecondColumn |
+-------+--------------+
|    10 |           10 |
|    20 |           30 |
|    30 |           60 |
|    40 |          100 |
+-------+--------------+

การทำงาน

  1. (SELECT @iterator := 0) tbl Initializes variable @iterator = 0
  2. Cross Join (Comma) ทำให้ Variable พร้อมใช้ในแถวแรก
  3. @iterator := Value + @iterator อัปเดตและคืนค่าใหม่ในแต่ละแถว
  4. ลำดับแถวสำคัญ: ต้องมี ORDER BY หากต้องการลำดับเฉพาะ

เพิ่ม ORDER BY ให้ชัดเจน

SELECT Value, (@iterator := Value + @iterator) AS RunningTotal
FROM DemoTable1868, (SELECT @iterator := 0) init
ORDER BY Id;  -- สมมติมี Id Column

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

SELECT 
    Value,
    SUM(Value) OVER (ORDER BY Id ROWS UNBOUNDED PRECEDING) AS RunningTotal
FROM DemoTable1868;

ข้อได้เปรียบของ Window Function

  • เป็น Standard SQL
  • ไม่ต้องพึ่ง Variable (Thread-safe)
  • รองรับ Frame Clause (RANGE/ROWS BETWEEN)
  • ทำงานถูกต้องใน Subquery/CTE
  • Optimizer จัดการได้ดีกว่า

ตัวอย่าง Window Functions อื่นๆ

-- Moving Average 3 rows
AVG(Value) OVER (ORDER BY Id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)

-- Rank
RANK() OVER (ORDER BY Value DESC)

-- Lead/Lag (ค่าก่อน/หลัง)
LAG(Value) OVER (ORDER BY Id) AS PrevValue
LEAD(Value) OVER (ORDER BY Id) AS NextValue