sql >> Databáze >  >> RDS >> Oracle

Nápověda k rekurzivnímu PL SQL dotazu

Toto je netestovaná přibližná odpověď (pokud jste poskytli create table a insert prohlášení pro vaše data/strukturu, otestoval bych to). Předpokládá, že v tabulce transakcí není žádné větvení (tj. link_trx_id je jedinečný). V zásadě používáme rekurzivní spojení k získání seskupení, nadřazených informací a pořadí, poté pomocí analytických funkcí získáme průběžný součet (current_net ). Spíše než se snažit získat předchozí součet (což bychom mohli udělat), zdá se, že dává větší smysl jednoduše odstranit credit aktuálního řádku a debit z 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))


  1. Dialogový tok PHP MySQL

  2. Jak nastavit oblast časového pásma pro připojení JDBC a vyhnout se tomu, že oblast časového pásma SqlException nebyla nalezena?

  3. Jak vytvořit složený primární klíč v SQL Server (příklad T-SQL)

  4. sqlalchemy a automatické přírůstky s postgresql