Как накапливать определенный столбец в ORACLE и освобождать значение в определенных условиях - PullRequest
0 голосов
/ 15 сентября 2018

У меня следующая таблица:

ID        ACTION_DATE              AMOUNT   ACTION_TYPE
--------------------------------------------------------
1   01-JAN-18 12.37.44.232000000 AM 24  Dr
1   01-JAN-18 12.38.16.928000000 AM 30  Dr
1   01-JAN-18 01.20.18.435000000 AM 200 Cr
1   01-JAN-18 01.35.43.462000000 AM 15  Dr
1   01-JAN-18 01.43.42.925000000 AM 30  Dr
1   01-JAN-18 01.49.23.746000000 AM 23  Dr
1   01-JAN-18 01.49.52.190000000 AM 26  Dr
2   01-JAN-18 12.37.44.232000000 AM 40  Dr
2   01-JAN-18 12.38.16.928000000 AM 50  Dr
2   01-JAN-18 01.20.18.435000000 AM 100 CR
2   01-JAN-18 01.35.43.462000000 AM 15  Dr
2   01-JAN-18 01.43.42.925000000 AM 20  Dr
2   01-JAN-18 01.49.23.746000000 AM 25  Dr
2   01-JAN-18 01.49.52.190000000 AM 30  Dr

, и таблица назначения будет иметь вид

ID  ACTION_DATE                 AMOUNT  ACTION_TYPE Acc_amount
---------------------------------------------------------------
1   01-JAN-18 12.37.44.232000000 AM 24  Dr  24
1   01-JAN-18 12.38.16.928000000 AM 30  Dr  54
1   01-JAN-18 01.20.18.435000000 AM 200 Cr  0
1   01-JAN-18 01.35.43.462000000 AM 15  Dr  15
1   01-JAN-18 01.43.42.925000000 AM 30  Dr  45
1   01-JAN-18 01.49.23.746000000 AM 23  Dr  68
1   01-JAN-18 01.49.52.190000000 AM 26  Dr  84
2   01-JAN-18 12.37.44.232000000 AM 40  Dr  40
2   01-JAN-18 12.38.16.928000000 AM 50  Dr  90
2   01-JAN-18 01.20.18.435000000 AM 100 CR  0
2   01-JAN-18 01.35.43.462000000 AM 15  Dr  15
2   01-JAN-18 01.43.42.925000000 AM 20  Dr  35
2   01-JAN-18 01.49.23.746000000 AM 25  Dr  60
2   01-JAN-18 01.49.52.190000000 AM 30  Dr  90

Я пытался выполнить задачу, используя over и partition byкак

select id, action_date,action_type, amount, 
sum(amount) over (partition by id order by action_date) as acc_amount
from cashanalysis  order by id,action_date;

как освободить acc_amount равным нулю, как только action_type = 'Cr'

Я ценю вашу помощь

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Я бы подумал об этом: «Я хочу определить группы, которые начинаются с« CR »».Это, в свою очередь, приводит к определению группы.Я могу определить каждую группу как совокупное число записей 'CR' до каждой записи.

После этого остальное - просто кумулятивные суммы:

select ca.*,
       sum(case when ca.action_type = 'Dr' then ca.amount else 0 
           end) over (partition by ca.id, ca.grp
                      order by ca.date
                     ) as acc_amount
from (select ca.*,
             sum(case when ca.action_type = 'Cr' then 1 else 0 end) over (partition by ca.id order by ca.action_date) as grp
      from cashanalysis ca
     ) ca;
0 голосов
/ 15 сентября 2018

То, что вам нужно, немного сложнее. Вы должны накопительно добавить последовательные дебеты.

Для этого последовательные строки с одинаковым action_type должны принадлежать к одной и той же группе, что может быть достигнуто с помощью подхода с разницей номеров строк (посмотрите на результаты внутреннего запроса, которые помогут вам понять). На основе этих классифицированных групп вы можете использовать оконную функцию sum, чтобы получить совокупную сумму для строк дебета.

select id,action_date,action_type,amount,
case when action_type='Cr' then 0 
else sum(amount) over(partition by id,grp,actiontype order by action_date)  
end as acc_amount
from (select id, action_date,action_type, amount, 
      row_number() over (partition by id order by action_date) 
      -row_number() over (partition by id,action_type order by action_date) as grp
      from cashanalysis
     ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...