Mysql
根據先前的和實際的行值計算行值
大家好,感謝您的幫助。
我有以下情況:一個名為 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)