oracle - 使用 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)
解决方案
由于仍未显示基表数据,因此很难从您的问题中分辨出来,但看起来您想要类似的东西:
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;
对于表中的每一行,它将总借方金额相加,并减去直到(但不包括)该行的贷方金额的总和。如果该总付款大于当前行的信用,则按原样使用信用值;如果它是负数(因为当前项目根本没有还清),则使用零代替;否则使用计算的值,即在考虑了所有先前的项目之后,该项目的信用额度已付清。
推荐阅读
- view - CouchDB 多级视图地图功能?
- cakephp - cakephp 3.7 如何设置邮件布局和模板
- ios - iOS Application_Home/Library/Caches 目录经常被清除
- angular - 如果用户已经登录,则显示/隐藏我的菜单
- java - 如何通过多个id找到一些数据?
- docker - Windows 10 Linux 子系统中的 Dockerfile 在当前目录中找不到文件
- django - 每个用户的合同的首次记录开始日期、最后记录结束日期以及如何应用过滤器
- java - java - 如何让玩家在Java中跳起来后慢慢向后移动
- javascript - toggle() 后位置发生意外变化的原因是什么?
- php - 如何使用 PHP 在报告中显示所有商店数据