通过SQL从钱包中减去金额

时间:2017-05-19 03:17:18

标签: sql database postgresql postgresql-9.3

对于以下设置(简化):

transaction:
| transaction_id | account_id | transaction_amount |
| 1              | 1          | 80                 |
| 2              | 2          | 30                 |
| 3              | 3          | 66                 |

wallet:
| wallet_id | wallet_type |account_id | wallet_total |
| 1         | 1           | 1         | 50           |
| 2         | 2           | 1         | 30           |
| 3         | 2           | 2         | 40           |
| 4         | 2           | 3         | 100          |
| 5         | 1           | 3         | 25           |

我需要以某种方式从wallet_type优先级中的钱包中减去transaction_amount(在这种情况下,wallet_type 1> wallet_type 2但优先级可以不同)。

e.g。

人1花费80,有2个包含50和30的钱包,首先从钱包1中取出50(wallet_type 1)然后拿出钱包2中的剩余30个(wallet_type 2),在两个钱包中留下0。

人2花30,有1个钱包(wallet_type 2)有40个,从中取30个离开10个

第3个人花费66,有2个包含25和100的钱包,首先从钱包1中取出25个(wallet_type 1)然后从钱包2(wallet_type 2)中取出(66-25 =)41,在钱包1和59中留下0在钱包2中。

循环执行事务后钱包的最终结果应如下所示:

| wallet_id | wallet_type |account_id | wallet_total |
| 1         | 1           | 1         | 0            |
| 2         | 2           | 1         | 0            |
| 3         | 2           | 2         | 10           |
| 4         | 2           | 3         | 59           |
| 5         | 1           | 3         | 0            | 

我坚持在所有情况下都这样做,我可以轻松地从方案2中减去它,因为它们只有1个桶可以减去,但不知道如何在一次更新中从一个桶中减去另一个桶。

如果我可以更新事务表以反映放入一个更容易的存储桶之后的数量..但我无法触及事务表。

我也能够"有点"通过查看他们的总钱包是否等于交易金额然后将钱包归零来为方案1做到这一点..但是由于显而易见的原因,这并不适用于所有情况。

有没有办法在一个更新/脚本中执行此操作?

0 个答案:

没有答案