2015-06-22 95 views
6

我有一個看起來像這樣的數據表:如何遞歸總結父/子層次

UnitID UnitParentID ScoreCount ScoreSum Level 
7112      72   292  1 
7120 7112    72   308  2 
7139 7112    24   82  2 
7150 7112    166   586  2 
23682 7112    104   414  2 
7100 7112    272   1016  2 
23691 7112    94   300  2 
23696 7112    24   80  2 
23700 23696    184   594  3 
23694 23691    24   64  3 
23689 7120    88   390  3 
7148 23696    112   420  3 
7126 7120    32   132  3 
7094 7120    96   332  3 
7098 7094    64   240  4 
23687 7094    16   62  4 

我正在尋找做從最低層次了遞歸添加到最高,這樣的數字下面匯入他們的父母。因此,家長會將現有的價值觀添加到任何孩子身上,樹頂部。

在此示例中,最後兩行將保持不變,因爲它們沒有子節點。單元ID 7094的總分數爲176(對於分數爲相同的邏輯),得分爲96(基礎)+ 64 + 16(2個孩子)。 3級的其他人將保持不變,因爲他們沒有孩子。我相信我需要從底部開始,以便上面的圖層對任何孩子都有正確的價值。

如果有人能指點我一個很好的來源,我可以學習如何完成這一點,我會非常感激。

+0

你可以使用遞歸CTE –

+0

郵報了一個例子輸出 – Matt

+3

第一個答案,以我認定爲重複應該爲你工作的問題。我不會將解決方案作爲答案發布,因爲我從鏈接的文章中調整了它,但無論如何:適用於您的表格和數據作爲工作解決方案:http://www.sqlfiddle.com/#!6/71409/1 – jpw

回答

0

WITH CTE AS ( SELECT 7112 unitid , NULL UnitParentId,72 ScoreCount,292 ScoreSum,1 Level UNION ALL SELECT 7120 unitid ,7112 UnitParentId,72 ScoreCount,308 ScoreSum,2 Level UNION ALL SELECT 7139 unitid ,7112 UnitParentId,24 ScoreCount,82 ScoreSum,2 Level UNION ALL SELECT 7150 unitid ,7112 UnitParentId,166 ScoreCount,586 ScoreSum,2 Level UNION ALL SELECT 23682 unitid ,7112 UnitParentId,104 ScoreCount,414 ScoreSum,2 Level UNION ALL SELECT 7100 unitid ,7112 UnitParentId,272 ScoreCount,1016 ScoreSum,2 Level UNION ALL SELECT 23691 unitid ,7112 UnitParentId,94 ScoreCount,300 ScoreSum,2 Level UNION ALL SELECT 23696 unitid ,7112 UnitParentId,24 ScoreCount,80 ScoreSum,2 Level UNION ALL SELECT 23700 unitid ,23696 UnitParentId,184 ScoreCount,594 ScoreSum,3 Level UNION ALL SELECT 23694 unitid ,23691 UnitParentId,24 ScoreCount,64 ScoreSum,3 Level UNION ALL SELECT 23689 unitid ,7120 UnitParentId,88 ScoreCount,390 ScoreSum,3 Level UNION ALL SELECT 7148 unitid ,23696 UnitParentId,112 ScoreCount,420 ScoreSum,3 Level UNION ALL SELECT 7126 unitid ,7120 UnitParentId,32 ScoreCount,132 ScoreSum,3 Level UNION ALL SELECT 7094 unitid ,7120 UnitParentId,96 ScoreCount,332 ScoreSum,3 Level UNION ALL SELECT 7098 unitid ,7094 UnitParentId,64 ScoreCount,240 ScoreSum,4 Level UNION ALL SELECT 23687 unitid ,7094 UnitParentId,16 ScoreCount,62 ScoreSum,4 Level ), RECURSIVECTE AS ( SELECT unitid, CONVERT(NVARCHAR(MAX),convert(nvarchar(20),unitid)) PARENTLIST, ScoreCount FROM CTE WHERE UnitParentId IS NULL

UNION ALL

SELECT C.unitid, CONVERT(NVARCHAR(MAX),convert(nvarchar(20),R.PARENTLIST) + ',' + convert(nvarchar(20),C.unitid)), C.ScoreCount
FROM RECURSIVECTE R INNER JOIN CTE C ON R.unitid = C.UnitParentId )

SELECT C.unitid, R.ScoreCount FROM CTE C CROSS APPLY ( SELECT SUM(ScoreCount) ScoreCount FROM RECURSIVECTE R WHERE CHARINDEX(convert(nvarchar(20),C.UNITID), R.PARENTLIST,0) > 0 ) R