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

Откуда: деревня Ильбяково Азнакаевского района РТ
Сообщений: 460
привет друзья,
очень хотелось бы сделать sql-запросом, без pl/sql.
Кредитом(рассрочкой) здесь называется сумма задолженности, которую должны вернуть частями, каждый период сумма возврата = сумма остатка задолженности * процент возврата.
Предположим
Если бы не было отсрочки платежа, то всё банально - через степень можно вычислить требуемое сальдо.
Если же в середине срока кредита предоставить отсрочку платежа по процентам на несколько периодов, то не могу сообразить, как можно вывести столбец, значения которого зависят от самого себя в предыдущей строке.
Вот такие тестовые данные:
with t as (
            select 100 credit_amount, 10 percent,  1 pay_group, 1 have_to_pay, 1 period_num, 10 amount_calculated, 10 amount_to_pay
            from dual union all
            select 100 amount, 10 percent,  2 pay_group, 0 have_to_pay, 2 period_num, 9 amount_calculated, 0 amount_to_pay
            from dual union all
            select 100 amount, 10 percent,  2 pay_group, 0 have_to_pay, 3 period_num, 9 amount_calculated, 0 amount_to_pay
            from dual union all
            select 100 amount, 10 percent,  2 pay_group, 1 have_to_pay, 4 period_num, 9 amount_calculated, 3*9 amount_to_pay
            from dual union all
            select 100 amount, 10 percent,  3 pay_group, 1 have_to_pay, 5 period_num, (100-10-9-9-9)*0.1 amount_calculated, 6.3 amount_to_pay
            from dual union all
            select 100 amount, 10 percent,  4 pay_group, 1 have_to_pay, 6 period_num, (100-10-9-9-9-6.3)*0.1 amount_calculated, 5.67 amount_to_pay
            from dual
)
select *
from t


тут credit_amount - сумма кредита, percent - процентная ставка возврата, have_to_pay - признак, должен ли кредитвзявший выплатить выплатить начисленную сумму возврата в этом периоде, period_num - номер периода начисления процентов.
Соответственно, начисленная сумма возврата amount_calculated = сальдо кредита на начало периода * ставку,
а сальдо кредита на начало периода = сальдо кредита на начало предыдущего периода - сумма фактического возврата предыдущего периода.
amount_to_pay - сколько кредитвзявший должен вернуть в заданном периоде.

Суть задачи:
колонка amount_calculated - это результат. Нужно в запросе вычислить его по описанным условиям.
1 сен 14, 15:05    [16520073]     Ответить | Цитировать Сообщить модератору
 Re: расчёт сальдо кредита(рассрочки) при наличии отсрочки платежей в середине  [new]
kaldorey
Member

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

Lag()
1 сен 14, 15:20    [16520148]     Ответить | Цитировать Сообщить модератору
 Re: расчёт сальдо кредита(рассрочки) при наличии отсрочки платежей в середине  [new]
Elic
Member

Откуда:
Сообщений: 29979
Shredder2003, Подсчет значений (учитывая предыдущие результаты)

kaldorey, думать надо больше и лучше.
1 сен 14, 15:43    [16520240]     Ответить | Цитировать Сообщить модератору
 Re: расчёт сальдо кредита(рассрочки) при наличии отсрочки платежей в середине  [new]
Shredder2003
Member

Откуда: деревня Ильбяково Азнакаевского района РТ
Сообщений: 460
Спасибо Элику за очередную подсказку по инструменту для решения.

Вот такое решение:

with data(credit_amount, percent, pay_group, have_to_pay, period_num, amount_calculated, amount_calculated_running, amount_to_pay, saldo) as (
    select 100 credit_amount, 10 percent, 1 pay_group, 1 have_to_pay, 1 period_num, 10 amount_calculated, 10 amount_calculated_running, 10 amount_to_pay
          ,100 saldo 
    from dual     
    union all
    select credit_amount+1, percent
          ,case when have_to_pay = 1
                then pay_group + 1
                else pay_group
           end pay_group
          ,case when period_num+1 between 2 and 3 
                then 0
                else 1
           end have_to_pay
          , period_num+1
          , (saldo-amount_to_pay)*percent/100 amount_calculated
          ,case when HAVE_TO_PAY = 0
                then amount_calculated_running
                else 0
           end + 
            (saldo-amount_to_pay)*percent/100 amount_calculated_running
          , case when 
                        case when period_num+1 between 2 and 3 
                             then 0
                             else 1
                        end
                     /* current HAVE_TO_PAY */ = 0
                 then 0
                 else 
                       case when HAVE_TO_PAY = 0
                            then amount_calculated_running
                            else 0
                       end + 
                        (saldo-amount_to_pay)*percent/100
                       /* current amount_calculated_running */
            end amount_to_pay 
          ,saldo - amount_to_pay as saldo 
    from data 
    where period_num < 6
)
select credit_amount, percent, pay_group, have_to_pay, period_num, amount_calculated, amount_calculated_running, amount_to_pay, saldo
from data


Единственное, очень не хватает ссылки на значение колонки в ЭТОЙ же строке.
В примере выше определяется
,case when period_num+1 between 2 and 3 
                then 0
                else 1
           end have_to_pay

, далее его нужно использовать например в множестве мест.
Было бы удобно ссылаться по какому-то алиасу, однако приходится полностью всюду копировать этот код.
1 сен 14, 18:45    [16520977]     Ответить | Цитировать Сообщить модератору
 Re: расчёт сальдо кредита(рассрочки) при наличии отсрочки платежей в середине  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
Shredder2003

[/src]

Единственное, очень не хватает ссылки на значение колонки в ЭТОЙ же строке.
В примере выше определяется
,case when period_num+1 between 2 and 3 
                then 0
                else 1
           end have_to_pay

, далее его нужно использовать например в множестве мест.
Было бы удобно ссылаться по какому-то алиасу, однако приходится полностью всюду копировать этот код.


oracle 12c + cross apply (или lateral, который в 11 версии недокументирован)
1 сен 14, 21:39    [16521451]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить