Mysql
計算執行餘額以儲存交易
我需要從遺留系統中放置一份餘額和交易數據的只讀副本,該副本僅用於查看/列印報表。
Balance | id | member_id | product_id | balance | | 1 | 100001 | 33 | 975.00 | | 1 | 100002 | 15 | 10.43 | | 1 | 100001 | 15 | 0.00 | Transactions | id | member_id | product_id | date | value | interest | | 1 | 100001 | 33 | 2014-09-01 | -100.00 | 0.00 | | 2 | 100001 | 33 | 2014-08-20 | 600.00 | 0.00 | | 1 | 100002 | 15 | 2014-06-01 | -50.00 | 0.00 | | 2 | 100001 | 15 | 2014-08-20 | -600.00 | 0.00 |
此數據是只讀的,並且由於遺留系統的外部問題,來自表的數據被清空,並且每次更新數據時都會重新插入所有內容。不理想,遺留系統應在 18 個月內更換。
我導入的交易數據沒有執行餘額列。我需要這個,並提出了兩個選擇:
- 不要儲存每筆交易的計算餘額,而是即時計算。這使得為帳戶報表分頁變得很痛苦,因為無論過去多久,我們都必須從最新的餘額開始並回溯所有的交易歷史。而且我不知道執行此遞歸查詢的快速方法。
- 導入交易時計算執行餘額,並將其儲存在每一行中。
第二個是我的首選(為了便於提取“2009 年 3 月的聲明”)。我一直在嘗試設計一種有效的方法來更新執行餘額:我最好的方法是為特定使用者的帳戶選擇所有交易,然後循環遍歷它們來更新數據。這不是高性能的。
你會如何處理這個問題?我的必須在 MySQL 上工作,但我也有興趣看到比它支持的更優雅的解決方案。
嘗試基於評論的答案
最簡單和最快的方法是採用基於集合的方法。像這樣:
1)讀
NOW()
入變數@N2)將新數據載入到
Transactions
3)
Balance
像這樣更新:UPDATE Balance B INNER JOIN ( SELECT SUM(value) as value, member_id, product_id FROM Transactions WHERE date >= @N) AS T ON B.member_id = T.member_id AND B.product_id = T.product_id SET B.balance = B.balance + T.value
- 利潤