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))