Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
dimyaz Member Откуда: Сообщений: 428 |
Можно ли размножить график платежей, с помощью 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 не получается. примерно пытаюсь получить такое:
|
|||||||||||||||||||||||||||||||||||||
1 фев 19, 18:09 [21800020] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 14350 |
|
||
1 фев 19, 18:12 [21800021] Ответить | Цитировать Сообщить модератору |
dimyaz Member Откуда: Сообщений: 428 |
не совсем понял, как может помочь row_Number |
||||
2 фев 19, 16:24 [21800447] Ответить | Цитировать Сообщить модератору |
SY Member Откуда: Middlebury, CT USA Сообщений: 9340 |
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] Ответить | Цитировать Сообщить модератору |
SY Member Откуда: Middlebury, CT USA Сообщений: 9340 |
Или с неитеративной моделькой: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] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 14350 |
Но поскольку "платежей" намекает на банковский процент, то принцип решения неозвученной задачи ошибочен, так как геометрическия прогрессия с множителем < 1 к нулую стремится только в бесконечности. 14/12/100 вероятно означает неверное деление процента по месяцам. |
||
2 фев 19, 18:13 [21800494] Ответить | Цитировать Сообщить модератору |
dimyaz Member Откуда: Сообщений: 428 |
SY, Спасибо, очень круто! никак руки не дойдут до изучения model. |
2 фев 19, 19:20 [21800511] Ответить | Цитировать Сообщить модератору |
dimyaz Member Откуда: Сообщений: 428 |
Вы правы, расчеты здесь указаны просто к примеру. Но у меня не получалось сделать именно перенос остатка на следующую строку. |
||||
2 фев 19, 19:25 [21800513] Ответить | Цитировать Сообщить модератору |
Все форумы / Oracle | ![]() |