sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo puedo resumir datos en una estructura similar a un árbol en SQL de niños a padres?

Esto obtendrá el informe 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 primera consulta obtiene la suma móvil pirateando la estructura del nombre del Departamento para los oen sin las cantidades, la segunda obtiene las hojas.
La primera consulta no puede mostrar las hojas, ya que se agruparán. No encontré ninguna combinación de columnas para obtener el mismo orden, las hojas parecen estar desordenadas.

SQLFiddle demostración

Intenté escribir un CTE recursivo , pero no es posible tener una función agregada, como SUM en ella.