2012-01-03 7 views
5

Mam własny przedstawieniu tabelę z zawartością jak ten:własny stół adresowe z tabeli podrzędnej

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

Hierarchia drzewa powinny wyglądać następująco

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

i stół że dziecko zapamiętuje liść tabeli nadrzędnej, który wygląda tak:

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

jestem próbuje zrolować sumę z węzła liści do hierarchii, aby powrócił jako.

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

Wszelkie pomysły, jak to osiągnąć w sql 2008? Z góry dziękuję.

Odpowiedz

5

EDIT Wszystko agregacja wyprowadziła się z 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

Dzięki za odpowiedź, Dem. Otrzymuję dwa komunikaty o błędach z tym zapytaniem: 'GROUP BY, HAVING lub funkcje agregujące nie są dozwolone w rekurencyjnej części wspólnego wyrażenia tabelarycznego 'flattend'' oraz' Zewnętrzne sprzężenie nie jest dozwolone w rekursywnej części rekurencyjne wyrażenie w tabeli "flattend". '. Jakieś pomysły? – Eric

+0

@Eric - Jestem tak nieobecny, że nawet nie pamiętałem, że tak będzie. Przepisałem tak, że cała agregacja odbywa się poza CTE. – MatBailie

+0

Przepraszam za spóźnioną odpowiedź, musiałem wyjechać wcześnie wczoraj i byłem na spotkaniu przez cały ranek. Zapytanie działa jak urok. Ale miałem problemy ze zrozumieniem CTE i jak działa funkcja COALESCE. Muszę dodać do wyniku wynik w kolumnie ParentID, aby można było odbudować strukturę drzewa w aplikacji, ale wciąż otrzymuję inną liczbę. Czy możesz pomóc trochę więcej? Dzięki jeszcze raz. – Eric

1

Oto ona:

Niech supose tego schematu:

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

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

Kwerenda jest samo wyjaśnił:

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 zwraca listę "liści" dla każdego pracownika (#parent), a następnie zapytanie sumuje całą sprzedaż dla tego "listków". You can test it running.

EDYCJI

Zapytanie jest stała.

+0

dzięki za odpowiedź.Próbowałem uruchomić kwerendę, ale zauważyłem, że suma węzła głównego jest niepoprawna. Suma dla Johna powinna wynosić 800 zamiast 400. – Eric

+0

@Eric, Naprawiono. Ale bądź ostrożny, jego suma wynosi 600, a nie 800 (jhon = 0, Mike = 0, Erin = 100 + 100, Janie = 200 + 200) – danihp

+0

moje złe. dzięki za poprawienie tego. Spędziłem w tej kwestii zbyt wiele godzin i w końcu mam to, czego potrzebuję. dzięki jeszcze raz. – Eric

Powiązane problemy