我能找到的关于计数的所有 CTE 示例都涉及经典的“经理有多少直接下属”。我对我无法弄清楚的事情有一个微妙的看法。本质上,我想查看层次结构中的每个节点,TOTAL 中有多少其他节点在所有级别下。因此,如果我在一家公司有 12 个人,上面的小伙子在他下面有 11 个,他可能有 3 个直接下属,第一个可能有 2 个,第二个可能有 2 个,第二个可能有 4 个,第三个有 3 个等等。我只是想不通如何获得节点下所有的总和,请帮助!
问问题
2357 次
2 回答
1
如果它必须是 CTE,这个应该可以工作(基于 AdventureWorks 数据库的查询)。选择填充 CTE 以递归方式构建给定 EmployeeID 以上所有经理的列表。最终选择计算所有出现在 AllManagers 列中的给定 EmployeeID。
WITH EmployeeList (EmployeeID, ManagerID, Level, AllManagers) AS
(
SELECT
EmployeeID,
ManagerID,
0 AS Level,
CAST(',' + CAST(EmployeeID AS varchar) + ',' AS varchar) AS AllManagers
FROM HumanResources.Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT
HumanResources.Employee.EmployeeID,
HumanResources.Employee.ManagerID,
EmployeeList.level + 1 AS level,
CAST(AllManagers + CAST(HumanResources.Employee.EmployeeID AS varchar) + ',' AS varchar) AS AllManagers
FROM HumanResources.Employee inner join EmployeeList ON HumanResources.Employee.ManagerID = EmployeeList.employeeID
)
SELECT
EmployeeID,
ManagerID,
Level,
AllManagers,
--have to subtract 1 because AllManagers path includes employee own ID
(SELECT COUNT(*) FROM EmployeeList T1 WHERE T1.allmanagers LIKE '%,' + CAST(EmployeeList.employeeid AS varchar) + ',%') - 1 AS Subordinates
FROM EmployeeList
ORDER BY Level
于 2011-06-10T10:40:39.377 回答
0
您有一个由具有自引用外键列的表表示的树结构,并且您想要计算树中每个节点的后代数。您将通过阅读这篇文章http://www.sqlmag.com/article/tsql3/calculate-the-sum-of-salaries-in-an-employee-tree- 更具体地在“解决方案”中找到问题的答案基于递归 CTE”段落。聪明的部分是您无需构建“级别”列(如果您不需要它)即可获得结果。
于 2011-07-06T14:34:11.163 回答