Vel*_*o89 6 sql oracle running-total
这就是表格的样子:
create table IncomeTest (SubjectId int, Date_Value date, debit number, credit number);
insert into IncomeTest values (1, '7-SEP-2017', 11000, 0);
insert into IncomeTest values (1, '7-DEC-2017', 6000, 0);
insert into IncomeTest values (1, '9-JAN-2018', 0, 16110);
insert into IncomeTest values (1, '9-JUL-2018', 0, 619.6);
insert into IncomeTest values (1, '23-JUL-2018', 0, 270.4);
commit;
Run Code Online (Sandbox Code Playgroud)
借方代表现金,贷方代表现金.插入表后,您将获得以下数据:
SubjectID | Date_value | Debit | Credit
1 9/7/2017 11000 0
1 12/7/2017 6000 0
1 1/9/2018 0 16110.0
1 7/9/2018 0 619.6
1 7/23/2018 0 270.4
Run Code Online (Sandbox Code Playgroud)
我的问题在于我必须计算用户何时偿还了他的贷款以及他/她迟到了多少钱,这意味着11000的第一笔借款是在2014年1月9日全额支付的:这里我计算了日期差异在这两个日期之间,这是多少付款延迟,但后来我需要从1/9/2018的信贷中拿走11000并转到下一笔借记,然后计算下次付款的全部时间.
我希望最终得到的结果是:
SubjectID | Date_value | Debit | Credit | PaymentLate |
1 9/7/2017 11000 0 124
1 12/7/2017 6000 0 228
Run Code Online (Sandbox Code Playgroud)
因为第1次借记在1/9/201全额支付,并且第2次借记在7/23/2018全额支付了... PaymentLate
是借方date_value
和信用的运行总额达到足够的钱之间的日期差.
我确实尝试过总计和总和,但是当我在完全支付时开始从信用卡上取走借款时我有问题...换句话说,我没有走得太远.
我正在使用Oracle 11.1.0.7.0企业版.
以下陈述应该做的伎俩:
WITH sum_data AS (SELECT subject_id
, date_value
, debit
, credit
, SUM(debit) over(PARTITION BY subject_id
ORDER BY date_value
ROWS UNBOUNDED PRECEDING) SUM_debit
, SUM(credit) over(PARTITION BY subject_id
ORDER BY date_value
ROWS UNBOUNDED PRECEDING) SUM_credit
FROM IncomeTest )
SELECT d.subject_id
, d.date_value
, d.debit
, d.credit
, GREATEST( (SELECT MIN(date_value)
FROM sum_data d2
WHERE d2.SUM_credit >= d.sum_debit
AND d2.subject_id = d.subject_id) - date_value
,0) PaymentLate
FROM sum_data d
WHERE debit != 0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
109 次 |
最近记录: |