首页 > 解决方案 > 使用 LAG 函数为客户生成条目

问题描述

我有以下设置,仅用于解释问题

如果没有购买其他车辆,这里 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

有时,如果他支付了 2019 年 1 月 3 日购买日期在借记客户下记录的唯一 15k,那么报告应该是

 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 日又支付了 30k,然后在借方客户基表下记录了 60k,但报告应显示如下

 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)

标签: oraclelag

解决方案


由于仍未显示基表数据,因此很难从您的问题中分辨出来,但看起来您想要类似的东西:

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;

db<>小提琴

对于表中的每一行,它将总借方金额相加,并减去直到(但不包括)该行的贷方金额的总和。如果该总付款大于当前行的信用,则按原样使用信用值;如果它是负数(因为当前项目根本没有还清),则使用零代替;否则使用计算的值,即在考虑了所有先前的项目之后,该项目的信用额度已付清。


推荐阅读