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