7

Ich muss jede Ebene die Summe aller untergeordneten Elemente (in der Hierarchie) zusätzlich zu den Werten haben, die für die Spalten "Budget" und "Überarbeitetes Budget" für diesen Wert festgelegt wurden.Summe der untergeordneten Ebenen insgesamt in einer Hierarchie

Ich habe eine vereinfachte Version meiner Tabellenstruktur und einige Beispieldaten hinzugefügt, um zu veranschaulichen, was gerade produziert wird und was ich gerne produzieren würde.

Probentabelle:

CREATE TABLE Item (ID INT, ParentItemID INT NULL, ItemNo nvarchar(10), ItemName nvarchar(max), Budget decimal(18, 4), RevisedBudget decimal(18, 4)); 

Beispieldaten:

INSERT INTO Item (ID, ParentItemID, ItemNo, ItemName, Budget, RevisedBudget) VALUES (1, NULL, N'10.01', N'Master Bob', 0.00, 17.00); 
INSERT INTO Item (ID, ParentItemID, ItemNo, ItemName, Budget, RevisedBudget) VALUES (2, 1, N'10.01.01', N'Bob 1', 0.00, 0.00); 
INSERT INTO Item (ID, ParentItemID, ItemNo, ItemName, Budget, RevisedBudget) VALUES (3, 2, N'10.01.02', N'Bob 2', 2.00, 2.00); 
INSERT INTO Item (ID, ParentItemID, ItemNo, ItemName, Budget, RevisedBudget) VALUES (4, 2, N'10.02.01', N'Bob 1.1', 1.00, 1.00); 

CTE SQL zu generieren Hierarchie:

WITH HierarchicalCTE 
AS 
(
    SELECT ID, ParentItemID, ItemNo, ItemName, Budget, RevisedBudget, 0 AS LEVEL 
    FROM Item 
    WHERE Item.ParentItemID IS NULL 

    UNION ALL 

    SELECT i.ID, i.ParentItemID, i.ItemNo, i.ItemName, i.Budget, i.RevisedBudget, cte.LEVEL + 1 
    FROM HierarchicalCTE cte 
    INNER JOIN Item i ON i.ParentItemID = cte.ID 
) 

So, mein derzeitiger CTE erzeugt (vereinfacht):

ID: 1, Level: 0, Budget: 0, RevisedBudget: 17 
ID: 2, Level: 1, Budget: 0, RevisedBudget: 0 
ID: 3, Level: 2, Budget: 2, RevisedBudget: 2 
ID: 4, Level: 2, Budget: 1, RevisedBudget: 1 

Und ich möchte, dass die Ergebnisse produzieren:

ID: 1, Level: 0, Budget: 3, RevisedBudget: 20 
ID: 2, Level: 1, Budget: 3, RevisedBudget: 3 
ID: 3, Level: 2, Budget: 2, RevisedBudget: 2 
ID: 4, Level: 2, Budget: 1, RevisedBudget: 1 

Hoffentlich ist leicht genug, um zu verstehen. CTE

Verbindung mit Tabelle SQLFiddle und initial: http://sqlfiddle.com/#!3/66f8b/4/0

Bitte beachten Sie, dass jede vorgeschlagene Lösung benötigt, in SQL Server 2008R2 zu arbeiten.

Antwort

8

Ihr ItemNo scheint die Elementhierarchie darin eingebettet zu haben. Der erste Wert sollte jedoch "10" anstatt "10 .01" sein. Wenn diese behoben wurden, würde die folgende Abfrage arbeiten:

select i.ID, i.ParentItemID, i.ItemNo, i.ItemName, 
     sum(isum.Budget) as Budget, 
     sum(isum.RevisedBudget) as RevisedBudget 
from item i left outer join 
    item isum 
    on isum.ItemNo like i.ItemNo+'%' 
group by i.ID, i.ParentItemID, i.ItemNo, i.ItemName; 

EDIT:

Um dies zu tun als rekursive CTE erfordert einen etwas anderen Ansatz. Die Idee der Rekursion besteht darin, für jeden möglichen Wert für ein Element eine eigene Zeile zu generieren (also alles unter) und dann die Werte zusammen zu aggregieren.

Die folgende tut, was Sie brauchen, außer es die Pegel in der umgekehrten Reihenfolge bringt (ich weiß nicht, ob das ein echtes Problem ist):

WITH HierarchicalCTE AS 
(
    SELECT ID, ParentItemID, ItemNo, ItemName, 
      Budget, RevisedBudget, 0 AS LEVEL 
    FROM Item i 
    UNION ALL 
    SELECT i.ID, i.ParentItemID, i.ItemNo, i.ItemName, 
      cte.Budget, cte.RevisedBudget, 
      cte.LEVEL + 1 
    FROM HierarchicalCTE cte join 
     Item i 
     ON i.ID = cte.ParentItemID 
) 
select ID, ParentItemID, ItemNo, ItemName, 
     sum(Budget) as Budget, sum(RevisedBudget) as RevisedBudget, 
     max(level) 
from HierarchicalCTE 
group by ID, ParentItemID, ItemNo, ItemName; 
+0

Ihre zweite Antwort mit dem CTE funktioniert gut. Ich habe es als Antwort akzeptiert. –