Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Размножить график платежей  [new]
dimyaz
Member

Откуда:
Сообщений: 432
Можно ли размножить график платежей, с помощью connect by level

Пример

Есть входящие даты 2

with t1 as (
 select sysdate curr_date, to_date('20.08.2019','dd.mm.yyyy') end_date, 50000 DEPT, 14/12/100 Rate
)
select add_months(curr_date , level-1), dept, dept*rate, percent, dept- dept*rate ostatok
from t2 
connect by add_months(curr_date , level-1) <= end_date


Так вот, как зацепиться во второй строке рекурсивно за остаток?
через lag lead не получается.

примерно пытаюсь получить такое:

Дата Долг Платеж Остаток
01.02.2019 50 000 583.5 49 416
01.03.2019 49 416 593 48 823
01.04.2019 48 823 586 48 237
01.05.2019 48 237 579 47 658
01.06.2019 47 658 572 47 086
01.07.2019 47 086 565 46 521
01.08.2019 46 521 558 45 963
01.09.2019 45 963 552 45 412
1 фев 19, 18:09    [21800020]     Ответить | Цитировать Сообщить модератору
 Re: Размножить график платежей  [new]
-2-
Member

Откуда:
Сообщений: 14838
dimyaz
через lag lead не получается.
row_number
1 фев 19, 18:12    [21800021]     Ответить | Цитировать Сообщить модератору
 Re: Размножить график платежей  [new]
dimyaz
Member

Откуда:
Сообщений: 432
-2-
dimyaz
через lag lead не получается.
row_number


не совсем понял, как может помочь row_Number
2 фев 19, 16:24    [21800447]     Ответить | Цитировать Сообщить модератору
 Re: Размножить график платежей  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9557
with t1 as (
            select  sysdate curr_date,
                    date '2019-08-20' end_date,
                    50000 DEPT,
                    14/12/100 rate
              from  dual
           )
select  dt,
        dept,
        platezh,
        ostatok
  from  t1
  model
    dimension by(
                 1 mon
                )
      measures(
               trunc(curr_date,'mm') dt,
               trunc(end_date,'mm') end_date,
               dept,
               rate,
               dept * rate platezh,
               dept - dept * rate ostatok
              )
      rules iterate(10e6) until(dt[iteration_number + 2] > end_date[1])
       (
        dt[iteration_number + 2] = add_months(dt[cv() - 1],1),
        dept[iteration_number + 2] = ostatok[cv() - 1],
        platezh[iteration_number + 2] = dept[cv()] * rate[1],
        ostatok[iteration_number + 2] = dept[cv()] - platezh[cv()]
       )
/

DT              DEPT    PLATEZH    OSTATOK
--------- ---------- ---------- ----------
01-FEB-19      50000 583.333333 49416.6667
01-MAR-19 49416.6667 576.527778 48840.1389
01-APR-19 48840.1389  569.80162 48270.3373
01-MAY-19 48270.3373 563.153935 47707.1833
01-JUN-19 47707.1833 556.583806 47150.5995
01-JUL-19 47150.5995 550.090328 46600.5092
01-AUG-19 46600.5092 543.672607 46056.8366
01-SEP-19 46056.8366  537.32976 45519.5068

8 rows selected.

SQL>


SY.
2 фев 19, 17:48    [21800489]     Ответить | Цитировать Сообщить модератору
 Re: Размножить график платежей  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9557
Или с неитеративной моделькой:

with t1 as (
            select  sysdate curr_date,
                    date '2019-08-20' end_date,
                    50000 DEPT,
                    14/12/100 rate
              from  dual
           )
select  dt,
        dept,
        platezh,
        ostatok
  from  t1
  model
    dimension by(
                 1 mon
                )
      measures(
               trunc(curr_date,'mm') dt,
               trunc(end_date,'mm') end_date,
               dept,
               rate,
               dept * rate platezh,
               dept - dept * rate ostatok,
               months_between(trunc(end_date,'mm'),trunc(curr_date,'mm')) + 2 last_mon
              )
      rules automatic order
       (
         dt[for mon from 2 to last_mon[1] increment 1] order by mon = add_months(dt[cv() - 1],1),
        platezh[for mon from 2 to last_mon[1] increment 1] = ostatok[cv() - 1] * rate[1],
        dept[for mon from 2 to last_mon[1] increment 1] = ostatok[cv() - 1],
        ostatok[for mon from 2 to last_mon[1] increment 1] = ostatok[cv() - 1] - platezh[cv()]
       )
/

DT              DEPT    PLATEZH    OSTATOK
--------- ---------- ---------- ----------
01-FEB-19      50000 583.333333 49416.6667
01-MAR-19 49416.6667 576.527778 48840.1389
01-APR-19 48840.1389  569.80162 48270.3373
01-MAY-19 48270.3373 563.153935 47707.1833
01-JUN-19 47707.1833 556.583806 47150.5995
01-JUL-19 47150.5995 550.090328 46600.5092
01-AUG-19 46600.5092 543.672607 46056.8366
01-SEP-19 46056.8366  537.32976 45519.5068

8 rows selected.

SQL>


SY.
2 фев 19, 18:01    [21800492]     Ответить | Цитировать Сообщить модератору
 Re: Размножить график платежей  [new]
-2-
Member

Откуда:
Сообщений: 14838
dimyaz
как может помочь row_Number
Член геометрической прогрессии вычисляется простым выражением по его номеру.
Но поскольку "платежей" намекает на банковский процент, то принцип решения неозвученной задачи ошибочен, так как геометрическия прогрессия с множителем < 1 к нулую стремится только в бесконечности.
14/12/100 вероятно означает неверное деление процента по месяцам.
2 фев 19, 18:13    [21800494]     Ответить | Цитировать Сообщить модератору
 Re: Размножить график платежей  [new]
dimyaz
Member

Откуда:
Сообщений: 432
SY,

Спасибо, очень круто!
никак руки не дойдут до изучения model.
2 фев 19, 19:20    [21800511]     Ответить | Цитировать Сообщить модератору
 Re: Размножить график платежей  [new]
dimyaz
Member

Откуда:
Сообщений: 432
-2-
dimyaz
как может помочь row_Number
Член геометрической прогрессии вычисляется простым выражением по его номеру.
Но поскольку "платежей" намекает на банковский процент, то принцип решения неозвученной задачи ошибочен, так как геометрическия прогрессия с множителем < 1 к нулую стремится только в бесконечности.
14/12/100 вероятно означает неверное деление процента по месяцам.


Вы правы, расчеты здесь указаны просто к примеру. Но у меня не получалось сделать именно перенос остатка на следующую строку.
2 фев 19, 19:25    [21800513]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить