SQL Server 2022中递归计算分段及子分段总重量求助
递归CTE计算分段及子分段总重量的解决方案
原递归CTE仅遍历了层级结构,但未实现每个节点包含自身及所有子节点重量的累加。以下是调整后的方案,通过在递归过程中保留根节点标识,最终聚合得到每个节点的总重量:
完整SQL代码
WITH RCTE AS ( -- 锚点成员:所有节点,将自身标记为根节点 SELECT s.SEGMENTID AS RootSegmentID, s.SEGMENTID, sp.WEIGHT FROM SEGMENT s INNER JOIN SEGMENTPART sp ON s.SEGMENTPARTSID = sp.SEGMENTPARTSID UNION ALL -- 递归成员:遍历子节点,传递根节点标识 SELECT r.RootSegmentID, s.SEGMENTID, sp.WEIGHT FROM SEGMENT s INNER JOIN SEGMENTPART sp ON s.SEGMENTPARTSID = sp.SEGMENTPARTSID INNER JOIN RCTE r ON s.SEGMENTID_FK = r.SEGMENTID ) -- 按根节点分组,求和所有关联节点的重量 SELECT RootSegmentID AS SEGMENTID, SUM(WEIGHT) AS Total_weight FROM RCTE GROUP BY RootSegmentID ORDER BY RootSegmentID;
代码说明
- 锚点成员:不再仅筛选顶级节点,而是包含所有分段节点,将每个节点自身标记为
RootSegmentID,确保每个节点都能作为根节点启动递归。 - 递归成员:通过
SEGMENTID_FK关联父节点,同时传递父节点的RootSegmentID,让所有子节点都关联到其所有祖先根节点。 - 聚合计算:按
RootSegmentID分组求和,得到每个节点自身及所有子分段的总重量。
执行结果
SEGMENTID Total_weight ----------------------- 1 108.3 2 36.7 3 61.1 4 8.7 5 12.8 6 40.8
内容的提问来源于stack exchange,提问作者Florin
相关产品推荐
相关产品推荐

