sql >> Database >  >> RDS >> Oracle

Hoe kan ik gegevens samenvatten in een boomachtige structuur in SQL van kinderen tot ouder?

Dit krijgt het volledige rapport

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

De eerste query krijgt de rollende som door de structuur van de afdelingsnaam voor de oens te hacken zonder de bedragen, de tweede krijgt de bladeren.
De eerste vraag kan de bladeren niet tonen, omdat ze gegroepeerd worden. t vond een kolomcombinatie om dezelfde volgorde te krijgen, de bladeren lijken ongeordend te zijn.

SQLFiddle demo

Ik heb geprobeerd een recursieve CTE te schrijven , maar het is niet mogelijk om een ​​aggregatiefunctie te hebben, zoals SUM erin.



  1. SQL-query om transitieve afhankelijkheden in de database op te lossen

  2. PostgreSQL-beperkingsproblemen

  3. Rijen retourneren die niet-alfanumerieke tekens bevatten in SQL Server

  4. PL/SQL print ref-cursor geretourneerd door een opgeslagen procedure