1

我能找到的关于计数的所有 CTE 示例都涉及经典的“经理有多少直接下属”。我对我无法弄清楚的事情有一个微妙的看法。本质上,我想查看层次结构中的每个节点,TOTAL 中有多少其他节点在所有级别下。因此,如果我在一家公司有 12 个人,上面的小伙子在他下面有 11 个,他可能有 3 个直接下属,第一个可能有 2 个,第二个可能有 2 个,第二个可能有 4 个,第三个有 3 个等等。我只是想不通如何获得节点下所有的总和,请帮助!

4

2 回答 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 回答