Sql 递归CTE以查找所有子级和父级的总计
我希望使用递归CTE找到所有childrencount和parentcount的总计,以及像这样的path和level以及currentlevelSql 递归CTE以查找所有子级和父级的总计,sql,sql-server,tsql,recursive-cte,Sql,Sql Server,Tsql,Recursive Cte,我希望使用递归CTE找到所有childrencount和parentcount的总计,以及像这样的path和level以及currentlevel Id ParentId Name Path Level CurrentLevel ChildrenCount ParentCount 1 NULL a 1 4 1 3 0 3 1
Id ParentId Name Path Level CurrentLevel ChildrenCount ParentCount
1 NULL a 1 4 1 3 0
3 1 c 3,1 3 2 2 1
4 3 d 4,3,1 2 3 1 2
5 4 f 5,4,3,1 1 4 0 3
2 NULL b 2 5 1 5 0
6 2 g 6,2 4 2 4 1
7 6 h 7,6,2 3 3 3 2
8 7 i 8,7.6.2 2 4 2 3
9 8 j 9,8,7,6,2 1 5 0 4
10 8 k 10,8,7,6,2 1 5 0 4
我尝试了以下代码,但我不知道如何获取childrencount和parentcount以及path和level以及currentlevel,如何对其进行动态编码并计算它
CREATE TABLE #temp([id] int, [parentid] int null,[name] varchar(5));
INSERT INTO #temp ([id], [parentid], [name])
VALUES ('1', null,'a')
, ('2', null,'b')
, ('3', '1','c')
, ('4', '3','d')
, ('5', '4','e')
, ('6', '2','f')
, ('7', '6','h')
, ('8', '7','i')
, ('9', '8','j')
, ('10', '8','k')
WITH AllChildrens as
(
SELECT p.*, CAST(P.Id AS VarChar(Max)) as [Path]
FROM Department P where p.ParentId is null
UNION ALL
SELECT P1.*, CAST(P1.Id AS VarChar(Max)) + ',' + M.[Path]
FROM Department P1
INNER JOIN AllChildrens M
ON M.Id = P1.ParentId
)
SELECT Id,ParentId,Name,Path From AllChildrens order by Id
一个选项是使用数据类型
hierarchyid
示例
;with cteP as (
Select ID
,parentid
,Name
,HierID = convert(hierarchyid,concat('/',ID,'/'))
From #Temp
Where parentid is null
Union All
Select ID = r.ID
,parentid = r.parentid
,Name = r.Name
,HierID = convert(hierarchyid,concat(p.HierID.ToString(),r.ID,'/'))
From #Temp r
Join cteP p on r.parentid = p.ID)
Select ID
,parentid
,Name
,Path = HierID.ToString()
,Depth = ( Select max(HierID.GetLevel() ) from cteP where HierID.ToString() like A.HierID.ToString()+'%') - HierID.GetLevel()
,Lvl = HierID.GetLevel()
,ChildCnt = ( Select count(*) from cteP where HierID.ToString() like A.HierID.ToString()+'%') -1
,ParentCnt = len(HierID.ToString()) - len(replace(HierID.ToString(),'/','')) - 2
From cteP A
Order By A.HierID
结果
有趣的是,您发布的代码甚至没有通过语法检查。当你展示2个顶级元素的3和4时,“深度”是什么意思?事实上,您希望如何计算所有其他值?从数据来看,这并不明显。“祖先”和“后代”可能比“父母”和“子女”更有意义,尽管没有解释就不明显。为什么
CurrentDepth
从不1
?@DaleK depth是级别,它表示子项中有多少级别。@DaleK我已修复了我的data@HABO我已经修正了我的数据,谢谢你的建议!太棒了!!PS ParentAccount与期望的结果不匹配-但可能OP是错误的?为什么id=5行深度=0但lvl=4它应该是深度=1?@Beidouan如果您希望它以1为基础而不是以0为基础,只需添加一个即可…@Beidouan您做了一些更改,我决定您可以在确定最终结果后进行调整。@Johncapelletti我已经确认了我的建议结果,您可以调整最新的代码。非常感谢。