Mysql

計算執行餘額以儲存交易

  • May 12, 2015

我需要從遺留系統中放置一份餘額和交易數據的只讀副本,該副本僅用於查看/列印報表。

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 個月內更換。

我導入的交易數據沒有執行餘額列。我需要這個,並提出了兩個選擇:

  1. 不要儲存每筆交易的計算餘額,而是即時計算。這使得為帳戶報表分頁變得很痛苦,因為無論過去多久,我們都必須從最新的餘額開始並回溯所有的交易歷史。而且我不知道執行此遞歸查詢的快速方法。
  2. 導入交易時計算執行餘額,並將其儲存在每一行中。

第二個是我的首選(為了便於提取“2009 年 3 月的聲明”)。我一直在嘗試設計一種有效的方法來更新執行餘額:我最好的方法是為特定使用者的帳戶選擇所有交易,然後循環遍歷它們來更新數據。這不是高性能的。

你會如何處理這個問題?我的必須在 MySQL 上工作,但我也有興趣看到比它支持的更優雅的解決方案。

嘗試基於評論的答案

最簡單和最快的方法是採用基於集合的方法。像這樣:

1)讀NOW()入變數@N

2)將新數據載入到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
  1. 利潤

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