使用 LAG 函数为客户生成条目
Using LAG function to produce entries for Customer
我有下面的设置,只是用来解释问题的
如果没有购买其他车辆,这里Car是默认购买的车辆
逻辑是,如果有批量付款,那么它应该在借方客户下分摊给车辆
实际交易情况如下
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 记录在借方客户群中 table 但报告应显示以下内容
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 日又支付了 30k,然后 60k 记录在借方客户群下 table 但报告应显示以下内容
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
TABLE 结构
VALUE DATE (bought date/paid date)
ITEM (Bought)
Debit_Entry (Debit Customer)
Credit_Entry (Credit_Acc)
很难从你的问题中判断出来,因为基础 table 数据仍然没有显示,但看起来你想要这样的东西:
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;
对于 table 中的每一行,它总计借方总额,并减去不超过(但不包括)该行的贷方总额。如果总付款大于当前行的信用值,则按原样使用信用值;如果它是负数(因为当前项目根本没有还清)则使用零代替;否则使用计算值,即已付清的该项目的信用额度 - 在考虑了所有先前项目之后。
我有下面的设置,只是用来解释问题的
如果没有购买其他车辆,这里Car是默认购买的车辆
逻辑是,如果有批量付款,那么它应该在借方客户下分摊给车辆
实际交易情况如下
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 记录在借方客户群中 table 但报告应显示以下内容
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 日又支付了 30k,然后 60k 记录在借方客户群下 table 但报告应显示以下内容
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
TABLE 结构
VALUE DATE (bought date/paid date)
ITEM (Bought)
Debit_Entry (Debit Customer)
Credit_Entry (Credit_Acc)
很难从你的问题中判断出来,因为基础 table 数据仍然没有显示,但看起来你想要这样的东西:
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;
对于 table 中的每一行,它总计借方总额,并减去不超过(但不包括)该行的贷方总额。如果总付款大于当前行的信用值,则按原样使用信用值;如果它是负数(因为当前项目根本没有还清)则使用零代替;否则使用计算值,即已付清的该项目的信用额度 - 在考虑了所有先前项目之后。