【问题标题】:Roll up count in hierarchical table(self referential table)分层表中的汇总计数(自引用表)
【发布时间】:2016-09-06 09:02:17
【问题描述】:

我有一个如下格式的表。这是一个自引用表,其中每条记录都指向其父记录。

NODE_ID  PARENT_ID  COUNT
1        0          NULL
2        1          NULL
3        2          10
4        2          12
5        0          NULL
6        5          NULL
7        6          NULL
8        7          12 

我希望输出采用以下格式。父级的计数应该是叶级的计数之和。 注意:只有叶子子节点会包含计数。我想把它卷起来直到父母。

NODE_ID  PARENT_ID  COUNT
1        0          22
2        1          22
3        2          10
4        2          12
5        0          12
6        5          12
7        6          12
8        7          12 

请帮忙。

【问题讨论】:

  • @GiorgosBetsos 我认为您误读了输出。节点 2 有两个子节点,总数为 22。反过来,节点1 只有2 作为孩子,其计数为22。他可能需要某种递归查询。
  • @Tim Biegeleisen 你是对的。我想要直接孩子的总数。

标签: sql-server common-table-expression self-referencing-table


【解决方案1】:

嗯,我想不出更简单的了:

;WITH GetLevelsCTE AS (
   SELECT NODE_ID, PARENT_ID, COUNT, level = 1, ROOT = NODE_ID
   FROM mytable
   WHERE PARENT_ID = 0

   UNION ALL

   SELECT t1.NODE_ID, t1.PARENT_ID, t1.COUNT, level = t2.level + 1, t2.ROOT
   FROM mytable AS t1
   JOIN GetLevelsCTE AS t2 ON t2.NODE_ID = t1.PARENT_ID
), MaxLevelCTE AS (
   -- Get MAX level per root NODE_ID
   SELECT MAX(level) AS max_level, ROOT
   FROM GetLevelsCTE
   GROUP BY ROOT
), GetCountCTE AS (
   -- Anchor query: start from the bottom 
   SELECT t1.NODE_ID, t1.PARENT_ID, t1.COUNT, t1.level
   FROM GetLevelsCTE AS t1
   JOIN MaxLevelCTE AS t2 ON t1.ROOT = t2.ROOT 
   WHERE t1.level = t2.max_level

   UNION ALL

   -- Recursive query: get counts of next level
   SELECT t1.NODE_ID, t1.PARENT_ID, t2.COUNT, t1.level
   FROM GetLevelsCTE AS t1
   JOIN GetCountCTE AS t2 ON t1.level = t2.level - 1 AND t1.NODE_ID = t2.PARENT_ID
)
SELECT NODE_ID, PARENT_ID, SUM(COUNT) AS COUNT
FROM GetCountCTE
GROUP BY NODE_ID, PARENT_ID
ORDER BY NODE_ID

简短说明:

  • GetLevelsCTE 用于为树的每个节点分配一个 level 编号。
  • MaxLevelCTE 使用之前的CTE 来获取树的最高层。
  • GetCountCTE 使用之前的 CTEs 来从底部遍历树到父节点。这样,COUNT 就会传播到父节点。

【讨论】:

  • :感谢重播。仅当只有一层层次结构时,您的查询才有效。如果在同一张表中我有两个顶级父级(没有父级或父级 id 为 0 的节点),那么它将无法解决。我希望你得到我的关注。
  • 我已经更新了问题表。 Parent id 0 表示树层次结构的根。
  • 我的错误,如果表中的树的部门不同,则会复制问题。编辑问题。
  • 已更正问题。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2018-10-03
  • 2021-06-03
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2021-12-25
  • 2017-02-25
相关资源
最近更新 更多