Прогрессивный расчет счета (отчет) нужен совет - LAG func (?) - PullRequest
0 голосов
/ 16 декабря 2009
with account as 
    (
    select 'client1' as client, to_date('09.2009' ,'MM.YYYY') as months, '09_1' as bill_num, 100 as BF_sum, 400 as Payed_SUM from dual
    union 
    select 'client1' as client, to_date('09.2009' ,'MM.YYYY') as months, '09_2' as bill_num, 150 as BF_sum, 50 as Payed_SUM  from dual 
    union
    select 'client1' as client, to_date('10.2009' ,'MM.YYYY') as months, '10_1' as bill_num, 150 as BF_sum, 50 as Payed_SUM  from dual
    union
    select 'client1' as client, to_date('11.2009' ,'MM.YYYY') as months, '11_1' as bill_num, 150 as BF_sum, 0 as Payed_SUM  from dual
    union
    select 'client1' as client, to_date('12.2009' ,'MM.YYYY') as months, '12_1' as bill_num, 150 as BF_sum, 100 as Payed_SUM  from dual
    )
    select client, months, BF_sum, Payed_SUM, KREDIT, KREDIT+lag( KREDIT,1, 0 ) over (partition by client order by months) as lead_val
    from (
    select client, months, sum(BF_sum) as BF_sum, sum(Payed_SUM) as Payed_SUM, ( sum(Payed_SUM)  - sum(BF_sum)) as KREDIT 
    from account 
    group by client, months
    )
    order by client, months

Как видите, при использовании функции LAG я получил следующее:

CLIENT  MONTHS               BF_SUM PAYED_SUM   KREDIT  LEAD_VAL
client1 01.09.2009 0:00:00  250 450 200 200
client1 01.10.2009 0:00:00  150 50  -100    100
client1 01.11.2009 0:00:00  150 0   -150    -250
client1 01.12.2009 0:00:00  150 100 -50 -200

И мне нужно использовать SUM от 09.2009 (Kredit = 200) для оплаты счетов за 10.2009 и других счетов, если деньги еще остались. поэтому я хотел бы получить результат:

client   months    BF_SUM  PAYED_SUM  KREDIT     NEW_KREDIT_MONTHS
client1 '09.2009'   250    450          200       0
client1 '10.2009'   150    50           -100      0  
client1 '11.2009'   150    0            -150      -50
client1 '12.2009'   150    100          -50      -50

Возможно, мне нужно подключиться к «циклу» через все неоплаченные суммы, пока кредит не закончится ???

Есть мысли, ребята?

1 Ответ

1 голос
/ 16 декабря 2009

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

with account as 
    (
    select 'client1' as client, to_date('09.2009' ,'MM.YYYY') as months, '09_1' as bill_num, 100 as BF_sum, 400 as Payed_SUM from dual
    union 
    select 'client1' as client, to_date('09.2009' ,'MM.YYYY') as months, '09_2' as bill_num, 150 as BF_sum, 50 as Payed_SUM  from dual 
    union
    select 'client1' as client, to_date('10.2009' ,'MM.YYYY') as months, '10_1' as bill_num, 150 as BF_sum, 50 as Payed_SUM  from dual
    union
    select 'client1' as client, to_date('11.2009' ,'MM.YYYY') as months, '11_1' as bill_num, 150 as BF_sum, 0 as Payed_SUM  from dual
    union
    select 'client1' as client, to_date('12.2009' ,'MM.YYYY') as months, '12_1' as bill_num, 150 as BF_sum, 100 as Payed_SUM  from dual
    )
select client, months, kredit, amount_short - lag(amount_short,1,0) over (partition by client order by months) new_kredit_months
from (
select client, months, kredit, least(cumulative_kredit,0) amount_short
from (
select client, months,kredit,sum(kredit) over (partition by client order by months) cumulative_kredit
from (
    select client, months, sum(BF_sum) as BF_sum, sum(Payed_SUM) as Payed_SUM, ( sum(Payed_SUM)  - sum(BF_sum)) as KREDIT 
    from account 
    group by client, months
    )
   )
  )
    order by client, months

Сначала я получаю совокупный промежуточный итог кредита. Затем замените положительные значения на 0, потому что я думаю, что вас интересует только просмотр отрицательных чисел. Затем вычислите сумму, на которую итоговое значение изменилось за один месяц, и это мое лучшее предположение относительно того, что вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...