7

各レベルは、予算および改訂予算列の値自体に対して設定された値に加えて、(階層内の)すべての子の合計である必要があります。階層内の合計子レベルの合計

私は、現在作成されているものと何を作りたいのかを示すために、私のテーブル構造の単純版といくつかのサンプルデータを含めました。

サンプルテーブル:

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

サンプルデータ:

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階層を生成するために:だから

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 
) 

は、現在、私のCTE(簡体)生産:

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 

そして、私は結果が生成します:理解するのは簡単です

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 

うまくいけば。テーブルと初期CTEとSQLFiddleへ

リンク:http://sqlfiddle.com/#!3/66f8b/4/0

どんな提案された解決策は、SQL Serverの2008R2で作業する必要がありますのでご注意ください。

答えて

8

ItemNoにアイテム階層が埋め込まれているようです。しかし、最初の値は'10 .01 'ではなく' 10 'でなければなりません。これが修正された場合は、次のクエリは動作します:

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:

再帰CTEとしてこれを行うには、やや異なるアプローチが必要です。再帰の考え方は、項目(つまり、以下のすべて)の可能な値ごとに別々の行を生成し、値をまとめて集計することです。

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

CTEとあなたの第二の答えは素晴らしい作品:

次は、それが逆の順序(つまり、本当の問題であれば、私は知らない)のレベルを置く以外、何が必要ありません。私はそれを答えとして受け入れました。 –

関連する問題