Mysql

根據先前的和實際的行值計算行值

  • August 31, 2018

大家好,感謝您的幫助。

我有以下情況:一個名為 statements 的表,其中包含欄位id (int)、stmnt_date (date)、debit (double)、credit (double) 和balance (double) 我的桌子的結構

我想按照以下規則計算餘額:

第一行餘額(按時間順序)=借方-貸方,其餘行

目前行餘額 = 按時間順序排列的前一行餘額 + 目前行借方 - 目前行貸方

正如您在上面的圖片中看到的那樣,行沒有按日期排列,這就是為什麼我按時間順序兩次使用這個詞來強調 stmnt_date 值的重要性。

非常感謝您的幫助。

假設stmnt_date有一個UNIQUE約束,使用視窗/分析函式會很容易:

SELECT 
   s.stmnt_date, s.debit, s.credit,
   SUM(s.debit - s.credit) OVER (ORDER BY s.stmnt_date
                                 ROWS BETWEEN UNBOUNDED PRECEDING
                                          AND CURRENT ROW)
       AS balance
FROM
   statements AS s
ORDER BY
   stmnt_date ;

不幸的是,MySQL(還)沒有實現分析功能。您可以使用嚴格的 SQL,通過自連接表(雖然 100% 工作但效率應該相當低)或通過使用特定的 MySQL 功能、變數(這將非常有效,但您必須對其進行測試)來解決問題升級 mysql 時,確保結果仍然正確,並且不會因某些優化改進而受損):

SELECT 
   s.stmnt_date, s.debit, s.credit,
   @b := @b + s.debit - s.credit AS balance
FROM
   (SELECT @b := 0.0) AS dummy 
 CROSS JOIN
   statements AS s
ORDER BY
   stmnt_date ;

使用您的數據,它將導致:

+------------+-------+--------+---------+
| stmnt_date | debit | credit | balance |
+------------+-------+--------+---------+
| 2014-05-15 |  3000 |      0 |    3000 |
| 2014-06-17 | 20000 |      0 |   23000 |
| 2014-07-16 |     0 |   3000 |   20000 |
| 2014-08-14 |     0 |   3000 |   17000 |
| 2015-02-01 |  3000 |      0 |   20000 |
+------------+-------+--------+---------+
5 rows in set (0.00 sec)

引用自:https://dba.stackexchange.com/questions/94545