2015-08-14 55 views
1

我有SQL中的樹結構表,我想要所有子節點和節點本身的總和。我能夠做的累計總和,而是針對特定SQL查詢獲得樹文件夾結構的累積和數量

SQL Fiddle

節點,但我想這樣

Id RootId FullName QTY CumulativeSum 
1 -1   ROOT 1 0 45 
2 1  SUB ITEM 1.1 9 9 
3 1 SUB ITEM 1.2 3 11 
4 3 SUB ITEM 1.2.1 1 1 
5 3 SUB ITEM 1.2.2 7 7 
6 1 SUB ITEM 1.3 5 25 
7 6 SUB ITEM 1.3.1 2 20 
8 7 SUB ITEM 1.3.1.1 18 18 

輸出我試圖查詢像

SELECT t1.Id,t1.RootId,t1.FullName,t1.QTY, 
SUM(t1.QTY) OVER(ORDER BY t1.Id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT 
ROW) AS CumulativeSum 
FROM #Tree t1 
ORDER BY t1.id 

但它不是給我所需的解決方案

+0

FYI:'RootId'真的應該,因爲它引用父,不是根叫'ParentId'。而且,對於根記錄它應該是'null',而不是'-1'。 – Andreas

+0

是的..我知道..謝謝你的幫助..你已經救了我的一天 – Mahajan344

回答

1

請參閱Recursive Queries Using Common Table Expressions

WITH cte (Id, RootId, ParentId, FullName, QTY) AS (
    SELECT Id, Id, RootId, FullName, QTY FROM Tree 
    UNION ALL 
    SELECT Tree.Id, cte.RootId, Tree.RootId, Tree.FullName, Tree.QTY 
    FROM cte 
    JOIN Tree ON Tree.RootId = cte.Id 
) 
SELECT RootId AS Id 
    , MIN(CASE WHEN Id = RootId THEN ParentId END) AS RootId 
    , MIN(CASE WHEN Id = RootId THEN FullName END) AS FullName 
    , MIN(CASE WHEN Id = RootId THEN QTY END) AS QTY 
    , SUM(QTY) AS CumulativeSum 
    FROM cte 
GROUP BY RootId 
ORDER BY Id 

輸出(使用SQL小提琴):

Id RootId FullName   QTY CumulativeSum 
-- ------ --------   --- ------------- 
1 -1  ROOT 1   0 45 
2 1  SUB ITEM 1.1  9 9 
3 1  SUB ITEM 1.2  3 11 
4 3  SUB ITEM 1.2.1 1 1 
5 3  SUB ITEM 1.2.2 7 7 
6 1  SUB ITEM 1.3  5 25 
7 6  SUB ITEM 1.3.1 2 20 
8 7  SUB ITEM 1.3.1.1 18 18 
9 -1  ROOT 2   0 0 
10 -1  ROOT 3   0 22 
11 10  SUB ITEM 3.1  1 22 
12 11  SUB ITEM 3.2  10 21 
13 12  SUB ITEM 3.3  4 11 
14 13  SUB ITEM 3.3.1 2 2 
15 13  SUB ITEM 3.3.2 5 5