Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Ajuda de consulta SQL PL recursiva


Esta é uma resposta aproximada não testada (se você forneceu create table e insert instruções para seus dados/estrutura, eu teria testado). Ele assume que não há ramificação em sua tabela de transações (ou seja, que link_trx_id é único). Basicamente, usamos uma junção recursiva para obter o agrupamento, as informações dos pais e a ordem e, em seguida, usamos funções analíticas para obter um total em execução (current_net ). Em vez de tentar obter o total anterior (o que poderíamos fazer), parece fazer mais sentido simplesmente remover o credit da linha atual e debit do current_net .
SELECT trx_id,
       debit,
       credit,
       root_amt - cum_debit + cum_credit + debit - credit AS current_gross,
       root_amt - cum_debit + cum_credit AS current_net
FROM   (SELECT trx_id,
               debit,
               credit,
               SUM(credit) OVER (PARTITION BY event_id ORDER BY lvl) AS cum_credit,
               SUM(debit) OVER (PARTITION BY event_id ORDER BY lvl) AS cum_debit,
               root_amt
        FROM   (SELECT     trx_id,
                           debit,
                           credit,
                           LEVEL AS lvl,
                           CONNECT_BY_ROOT (gross_amount) AS root_amt,
                           CONNECT_BY_ROOT (event_id) AS event_id
                FROM       transaction t LEFT OUTER JOIN event e ON t.trx_id = e.transaction_id
                CONNECT BY link_trx_id = PRIOR trx_id
                START WITH link_trx_id IS NULL))