sql—如何用带连接表的postgres计算会计余额

vxqlmq5t  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(324)

我在postgres中遇到了一个和这个计算余额相同的问题,但是在join表中。
我有一张table

ID      amount     deduct_id     created_time
1      100.00          1         2020-01-01 15:30:20
2       10.00          1         2020-01-01 15:32:20 
3       30.00          1         2020-01-01 15:43:20
4        5.00          1         2020-02-02 08:30:20
5       10.00          2         2020-02-02 23:30:20
6       20.00          2         2020-02-03 10:30:20

表b和

deduct_id      amount      created_time
1              100.00      2020-02-02 10:00:20
2               15.00      2020-02-03 10:00:20

现在我需要一个查询,它会给出以下结果:

ID     amount    deduct    Balance    created_time
1      100.00     0.00      100.00    2020-01-01 15:30:20
2       10.00     0.00      110.00    2020-01-01 15:32:20
3       30.00     0.00      140.00    2020-01-01 15:43:20
4        5.00     0.00      145.00    2020-02-02 08:30:20
null     0.00   100.00       45.00    2020-02-02 10:00:20
5       10.00     0.00       55.00    2020-02-02 23:30:20
null     0.00    15.00       40.00    2020-02-03 10:00:20
6       20.00     0.00       60.00    2020-02-03 10:30:20

我用的是Postgres9.6
扣减标识是指数据是否是该日期扣减的一部分。
创建时间是指时间线。
【更新】如何实现按月过滤?

ID     amount    deduct    Balance    created_time
1      100.00     0.00      100.00    2020-01-01 15:30:20
2       10.00     0.00      110.00    2020-01-01 15:32:20
3       30.00     0.00      140.00    2020-01-01 15:43:20

ID     amount    deduct    Balance    created_time
4        5.00     0.00      145.00    2020-02-02 08:30:20
null     0.00   100.00       45.00    2020-02-02 10:00:20
5       10.00     0.00       55.00    2020-02-02 23:30:20
null     0.00    15.00       40.00    2020-02-03 10:00:20
6       20.00     0.00       60.00    2020-02-03 10:30:20

我知道这是一个糟糕的设计表,但有可能达到这样的结果吗?怎么做?
谢谢你的帮助。

yhxst69z

yhxst69z1#

我想那是 union all 还有一扇Windows sum() :

select
    id,
    amount,
    deduct,
    sum(amount - deduct) over(order by created_time) balance,
    created_time
from (
    select id, amount, 0 as deduct, created_time from tablea
    union all 
    select null, 0 as amount, amount as deduct, created_time from tableb
) t

我不清楚是哪个栏目 deduct_id 应该是用来做的。从查询结果来看,您似乎不想使用它来定义分区,这与我的想法相反—所以我只是从查询中删除了if。

相关问题