我需要从遗留系统中提供余额和交易数据的只读副本,该副本仅用于查看/打印语句.
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()读入变量@N
2)将新数据加载到事务中
3)像这样更新平衡:
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
4)利润