Oracle
 sql >> Database >  >> RDS >> Oracle

Come posso riassumere i dati in una struttura ad albero in SQL dai bambini al genitore?

Questo otterrà il rapporto completo

SELECT t1.DEPARTMENT_ID
     , t1.PARENT_DEP_ID
     , t1.DEPARTMENT   
     , Sum(t2.Amount) Amount
FROM   TREE_DATA t1
       INNER JOIN TREE_DATA t2 
       ON t1.DEPARTMENT = SUBSTR(t2.DEPARTMENT, 1, LENGTH(t1.DEPARTMENT))
WHERE  t1.Amount = 0
GROUP BY t1.DEPARTMENT_ID, t1.PARENT_DEP_ID, t1.DEPARTMENT

UNION ALL

SELECT DEPARTMENT_ID
     , PARENT_DEP_ID
     , DEPARTMENT   
     , Amount
FROM   TREE_DATA
WHERE  Amount > 0
ORDER BY DEPARTMENT

La prima query ottiene la somma mobile hackerando la struttura del nome del Dipartimento per gli oens senza gli importi, la seconda ottiene le foglie.
La prima query non può mostrare le foglie, poiché verranno raggruppate.Ho' t trovato qualsiasi combinazione di colonne per ottenere lo stesso ordine, le foglie sembrano non ordinate.

SQLFiddle demo

Ho provato a scrivere un CTE ricorsivo , ma non è possibile avere una funzione aggregata, come SUM in esso.