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

Jon*_*oJr 6 sql t-sql sql-server

我有一个如下所示的数据表:

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
Run Code Online (Sandbox Code Playgroud)

我要做的是递归地从最低层次添加到最高层,以便下面的数字汇总到它们的父层.所以父母会将任何孩子的现有值添加到树上.

在此示例中,最后两行将保持不变,因为它们没有子项.单元ID 7094的得分为96(基础)+ 64 + 16(2个孩子),总计176(并且得分的逻辑相同).3级的其他人将保持不变,因为他们没有孩子.我相信我需要从底部开始,以便上面的图层对任何孩子都有正确的值.

如果有人能指出一个好的来源,我可以学习如何实现这一目标,我会非常感激.

小智 0

热膨胀系数为 ( SELECT 7112 unitid , NULL UnitParentId,72 ScoreCount,292 ScoreSum,1 级 UNION ALL SELECT 7120 unitid ,7112 UnitParentId,72 ScoreCount,308 ScoreSum,2 级 UNION ALL SELECT 7139 unitid ,7112 UnitParentId,24 ScoreCount,82 ScoreSum,2 级别 UNION ALL SELECT 7150 unitid ,7112 UnitParentId,166 ScoreCount,586 ScoreSum,2 级 UNION ALL SELECT 23682 unitid,7112 UnitParentId,104 ScoreCount,414 ScoreSum,2 级 UNION ALL SELECT 7100 unitid ,7112 UnitParentId,272 ScoreCount,1016 ScoreSum,2 级别 UNION ALL SELECT 23691 unitid ,7112 UnitParentId,94 ScoreCount,300 ScoreSum,2 级 UNION ALL SELECT 23696 unitid ,7112 UnitParentId,24 ScoreCount,80 ScoreSum,2 级别 UNION ALL 选择 23700 unitid ,23696 UnitParentId,184 ScoreCount,594 ScoreSum,3 级 UNION ALL SELECT 23694 unitid ,23691 UnitParentId,24 ScoreCount,64 ScoreSum,3 级别 UNION ALL SELECT 23689 unitid ,7120 UnitParentId,88 ScoreCount,390 ScoreSum,3 级 UNION ALL SELECT 7148 unitid ,23696 UnitParentId,112 ScoreCount,420 ScoreSum,3 级 UNION ALL SELECT 7126 unitid ,7120 UnitParentId,32 ScoreCount,132 ScoreSum,3 级别 UNION ALL 选择 7094 unitid ,7120 UnitParentId,96 ScoreCount,332 ScoreSum,3 级 UNION ALL SELECT 7098 unitid ,7094 UnitParentId,64 ScoreCount,240 ScoreSum,4 级别 UNION ALL 选择 23687 单位 ID,7094 单位父 ID,16 ScoreCount,62 ScoreSum,4 级别 ), 递归AS ( 选择unitid,CONVERT(NVARCHAR(MAX),转换(nvarchar(20),unitid))PARENTLIST,ScoreCount 来自 CTE 其中 UnitParentId 为 NULL

联合所有

SELECT C.unitid,CONVERT(NVARCHAR(MAX),转换(nvarchar(20),R.PARENTLIST)+','+转换(nvarchar(20),C.unitid)),C.ScoreCount
来自递归函数 INNER JOIN CTE C ON R.unitid = C.UnitParentId )

SELECT C.unitid, R.ScoreCount 来自 CTE C 交叉申请 ( 选择 SUM(ScoreCount) ScoreCount 来自递归函数 WHERE CHARINDEX(convert(nvarchar(20),C.UNITID), R.PARENTLIST,0) > 0 )R