Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Hilfe zur rekursiven PL SQL-Abfrage

Dies ist eine ungetestete, ungefähre Antwort (wenn Sie create table angegeben hatten und insert Aussagen für Ihre Daten / Struktur, ich hätte es getestet). Es wird davon ausgegangen, dass es keine Verzweigung in Ihrer Transaktionstabelle gibt (d. h. diese link_trx_id ist einzigartig). Grundsätzlich verwenden wir eine rekursive Verknüpfung, um die Gruppierung, übergeordnete Informationen und Reihenfolge zu erhalten, und verwenden dann Analysefunktionen, um eine laufende Summe zu erhalten (current_net ). Anstatt zu versuchen, die vorherige Summe zu erhalten (was wir tun könnten), scheint es sinnvoller zu sein, einfach den credit der aktuellen Zeile zu entfernen und debit aus dem 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))