2012-01-03 18 views
5

Tengo una tabla hace referencia a sí con el contenido de la siguiente manera:propia tabla de referencia con la tabla secundaria

Self-referencing parent table 
ID ParentID Name 
--------------------- 
1    John 
2 1   Mike 
3 2   Erin 
4 1   Janie 
5    Eric 
6 5   Peter 

La jerarquía de árbol debería tener este aspecto

  • John
    • Mike
      • Erin
    • Janie
  • Eric
    • Peter

Y una tabla secundaria que almacena la hoja de tabla primaria que tiene este aspecto:

ID Sales 
3 100 
3 100 
4 200 
4 200 
6 300 
6 300 
6 300 

estoy tratando de acumular la suma desde el nodo hoja hasta la jerarquía para que vuelva como.

ID Name Sum 
1 John 800 
2 Mike 200 
3 Erin 200 
4 Janie 400 
5 Eric 900 
6 Peter 900 

¿Alguna idea de cómo lograr esto en sql 2008? Gracias por adelantado.

Respuesta

5

EDITAR Toda la agregación salió de la CTE

WITH 
    tree AS 
(
    SELECT 
    id    AS root_id, 
    name    AS root_name, 
    id    AS leaf_id 
    FROM 
    yourTreeTable 

    UNION ALL 

    SELECT 
    tree.root_id  AS root_id, 
    tree.name   AS root_name, 
    yourTreeTable.id AS leaf_id 
    FROM 
    tree 
    INNER JOIN 
    yourTreeTable 
     ON tree.leaf_id = yourTreeTable.ParentID 
) 
SELECT 
    tree.root_id, 
    tree.root_name, 
    COALESCE(SUM(yourScoresTable.score), 0) AS total 
FROM 
    tree 
LEFT JOIN 
    yourScoresTable 
    ON yourScoresTable.ID = tree.leafID 
GROUP BY 
    tree.root_id, 
    tree.root_name 
+0

Gracias por la respuesta, dem. Recibo dos mensajes de error con esa consulta: 'GROUP BY, HAVING o funciones agregadas no están permitidas en la parte recursiva de una expresión de tabla común recursiva 'flattend'. Y' Outer join no está permitido en la parte recursiva de una expresión de tabla común recursiva 'flattend'. '. ¿Algunas ideas? – Eric

+0

@Eric - Estoy tan fuera de práctica que ni siquiera recuerdo que ese sería el caso. He vuelto a codificar de modo que toda la agregación se realice fuera del CTE. – MatBailie

+0

disculpa por la respuesta tardía, tuve que irme temprano ayer y estuve en una reunión toda la mañana. La consulta funciona como encanto. Pero tuve problemas para entender el CTE y cómo funciona la función COALESCE. Necesito agregar la columna ParentID al resultado para poder reconstruir la estructura de árbol en la aplicación, pero sigo contando de manera diferente. ¿Puedes ayudar un poco más? Gracias de nuevo. – Eric

1

Aquí está:

Vamos a supose este esquema:

​create table #parent (
ID int, 
ParentID int, 
Name varchar(50)); 

create table #child (
ID int, 
Sales int); 

La consulta es uno mismo explicó:

WITH 
    tree AS 
(
    SELECT 
    id as id_parent, 
    id as id 
    FROM 
    #parent 
    UNION ALL 
    SELECT 
    tree.id_parent as id_parent, 
    #parent.id AS id 
    FROM 
    tree 
    INNER JOIN 
    #parent  
     ON tree.id = #parent.ParentID 
) 
SELECT 
    #parent.id, 
    #parent.name, 
    COALESCE(SUM(#child.Sales), 0) AS total 
FROM 
    #parent 
LEFT JOIN 
    tree 
    ON #parent.ID = tree.id_parent 
LEFT JOIN 
    #child on tree.id = #child.id 
GROUP BY 
    #parent.id, 
    #parent.name 

CTE devuelve una lista de 'hojas' para cada empleado (#parent), luego consulta suma todas las ventas para esta 'hojas'. You can test it running.

EDITADO

de consulta es fijo.

+0

gracias por la respuesta.Traté de ejecutar la consulta pero noté que la suma del nodo raíz no es correcta. La suma para John debe ser 800 en lugar de 400. – Eric

+0

@Eric, Fixed. Pero cuidado, la suma de John es 600 no 800 (jhon = 0, Mike = 0, Erin = 100 + 100, Janie = 200 + 200) – danihp

+0

mi mal. gracias por corregir eso. He pasado demasiadas horas en este tema y finalmente obtuve lo que necesito. gracias de nuevo. – Eric

Cuestiones relacionadas