Oracle
 sql >> Base de données >  >> RDS >> Oracle

Aide sur les requêtes SQL PL récursives

Il s'agit d'une réponse approximative non testée (si vous aviez fourni create table et insert déclarations pour vos données/structure, je l'aurais testé). Il suppose qu'il n'y a pas de branchement dans votre table de transactions (c'est-à-dire que link_trx_id est unique). Fondamentalement, nous utilisons une jointure récursive pour obtenir le regroupement, les informations sur les parents et l'ordre, puis utilisons des fonctions analytiques pour obtenir un total cumulé (current_net ). Plutôt que d'essayer d'obtenir le total précédent (ce que nous pourrions faire), il semble plus logique de simplement supprimer le credit de la ligne actuelle et debit depuis le 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))