如何递归求和父/子层次结构

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将具有得分计数96(基础)+64 + 16(2个子项),新的总计为176(并且得分总和的逻辑相同)。第3层的其他行将保持不变,因为它们没有子项。我认为我需要从底部开始,以便上面的层次拥有任何子项的正确值。
如果有人能指导我找到一个好的资源帮助我完成这个任务,我将非常感激。

你可以使用递归CTE。 - Sébastien Sevrin
贴出一个输出示例 - Matt
3
我标记为重复的问题的第一个回答应该适用于你。我不会将解决方案发布为答案,因为我是从链接帖子中适应它的,但是,已经适应您的表格和数据作为可行的解决方案:http://www.sqlfiddle.com/#!6/71409/1 - jpw
1个回答

0

使用CTE进行递归查询: ( 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 ), 使用递归CTE查询: ( 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接