我有以下设置,仅用于解释问题
如果未购买其他车辆,则这是默认购买的汽车
逻辑是,如果有大笔付款,则应在“借方客户”下将其分配给各个车辆
实际交易如下所示
bought date Bought Credit_Acc Debit Customer paid_date
----------- ------ ---------- -------------- ----------
1-jan-2019 Bike 10k 0 03-Jan-2019
2-jan-2019 cycle 20k 0 03-Jan-2019
3-jan-2019 Car 30k 60k 03-Jan-2019
但是客户希望财务报告如下所示
bought date Bought Credit_Acc Debit Customer paid_date
----------- ------ ---------- -------------- ----------
1-jan-2019 Bike 10k 10k 03-Jan-2019
2-jan-2019 cycle 20k 20k 03-Jan-2019
3-jan-2019 Car 30k 30k 03-Jan-2019
有时,如果他只支付了借方客户项下记录的15k 对于2019年1月3日的购买日期,则报告应为
bought date Bought Credit_Acc Debit Customer paid_date
----------- ------ ---------- -------------- ----------
1-jan-2019 Bike 10k 10k 03-Jan-2019
2-jan-2019 cycle 20k 5k 03-Jan-2019
3-jan-2019 Car 30k 0(15k actual data) 03-Jan-2019
因此,在这15k付款之后,又在2019年1月4日完成了15k付款,然后在借方客户基本表中记录了30k,但报告应显示以下内容
bought date Bought Credit_Acc Debit Customer paid_date
----------- ------ ---------- -------------- ----------
1-jan-2019 Bike 10k 10k 04-Jan-2019
2-jan-2019 cycle 20k 20k 04-Jan-2019
3-jan-2019 Car 30k 0(30k actual data) 04-Jan-2019
然后在这笔付款之后,在2019年1月5日又赚了3万,然后在借方客户基本表中记录了6万,但是报告应显示以下内容
bought date Bought Credit_Acc Debit Customer paid_date
----------- ------ ---------- -------------- ----------
1-jan-2019 Bike 10k 10k 05-Jan-2019
2-jan-2019 cycle 20k 20k 05-Jan-2019
3-jan-2019 Car 30k 30k(60k actual data)05-Jan-2019
表结构
VALUE DATE (bought date/paid date)
ITEM (Bought)
Debit_Entry (Debit Customer)
Credit_Entry (Credit_Acc)
答案 0 :(得分:2)
很难回答您的问题,因为仍然没有显示基表数据,但是您似乎想要以下内容:
select value_date, item, credit_entry, item_paid
from (
select value_date, item, credit_entry, debit_entry,
greatest(0, least(credit_entry, nvl(sum(debit_entry) over (), 0)
- nvl(sum(credit_entry) over (order by value_date
rows between unbounded preceding and 1 preceding), 0))) as item_paid
from your_table
)
where item is not null;
对于表中的每一行,它求和总借方金额,并减去直到(但不包括)该行的贷方金额的总和。如果总付款额大于当前行的信用额度,则该信用额度将按原样使用;如果它是负数(因为根本没有还清当前项目),则使用零代替;否则,将使用计算出的值,该值是在考虑了所有先前项目之后已还清的该项目的信用额。