我正在尝试在多个发票交易中实现付款分配,这是批处理过程的一部分。发票和付款交易保存在同一个表中,作为交易记录。
所以对于例如。我们在交易记录表中有:
ID, USER , TYPE , AMOUNT
1 Mr. X Invoice 1000
2 Mr. X Invoice 2000
3 Mr. X Invoice 1000
4 Mr. X Payment -3000
5 Mr. X Payment -500
我正在寻找一个查询,将为此用户支付3500总额,从第一张发票开始,将付款分配到每张发票并将其转储到新表中。
新表的最终结果如下所示。
ID User , TYPE , AMOUNT , AMOUNT_PAID
1 Mr. X Invoice 1000 1000
2 Mr. X Invoice 2000 2000
3 Mr. X Invoice 1000 500
我试图避免在PL / SQL块中使用循环。 任何评论都非常感谢!
答案 0 :(得分:2)
所以这个解决方案使用两个分析函数。在内部查询中,它使用分析SUM()来跟踪发票金额的滚动总计。在外部查询中,当付款总额不足时,它使用LAG()来获取先前的发票总额。
select id
, username
, amount
, case when tot_amount >= rolling_pay
then amount
else
tot_amount - lag(rolling_pay) over (order by id)
end as amount_paid
from (
with inv as (select id
, username
, amount
from transactions
where type = 'Invoice' )
, pay as ( select username
, abs(sum(amount)) as tot_amount
from transactions
where type = 'Payment'
group by username )
select inv.id
, inv.username
, inv.amount
, pay.tot_amount
, sum(inv.amount) over (partition by inv.username order by inv.id) as rolling_pay
from inv join pay
on inv.username = pay.username
order by inv.username, inv.id
)
注意:我总结了付款,因为每个商家密钥不止一个。
这是inevitable SQL Fiddle证明这会产生预期的结果。