Промежуточный итог - разница в дате - PullRequest
0 голосов
/ 30 августа 2018

Вот как выглядит таблица:

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;

Дебет представляет собой вывод средств, кредит представляет собой ввод средств. После вставки в таблицу вы получаете следующие данные:

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

Моя проблема заключается в том, что я должен рассчитать, когда пользователь погасил свой кредит и сколько он / она опоздал с платежом, что означает, что первый дебет в 11000 был полностью оплачен 9 января 2008 года: здесь я вычислите разницу в датах между этими двумя датами, и это означает, что оплата была запоздалой, но затем мне нужно взять эти 11000 от суммы кредита от 1/9/2018 и перейти к следующему дебету, а затем вычислить, когда этот следующий дебет был полностью оплачен .

Результат, который я надеюсь получить в конце:

SubjectID | Date_value | Debit | Credit | PaymentLate |
    1        9/7/2017    11000        0           124
    1        12/7/2017    6000        0           228

Поскольку 1-й дебет был полностью оплачен 9/9/2018, а 2-й дебет был полностью оплачен 23.07.2008 ... PaymentLate - это разница между датой date_value и датой, когда Общая сумма кредита достигла достаточно денег.

Я пытался использовать итоговую сумму и суммы, но у меня возникла проблема, когда я начал снимать дебет с кредита, когда он был полностью оплачен ... другими словами, я не ушел далеко.

Я использую Oracle 11.1.0.7.0 Enterprise Edition.

1 Ответ

0 голосов
/ 30 августа 2018

Следующее утверждение должно сработать:

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
...