SQL查询以获取每个经理下员工的递归数

Dev*_*_29 3 sql sql-server sql-server-2008

我正在寻找一个SQL查询以获取Employee每个管理器或其他表中某些管理器下的递归计数。

表结构为:

Emp_Table

Emp_id Manager_id
1         1
2         1
3         1
4         3
5         3
6         5
7         5
8         7
9         7
10        7
Run Code Online (Sandbox Code Playgroud)

执行表:

该表仅此而已,但此处提供了选定的经理。我需要得到这个经理下每个员工的人数

Manager_id
     1
     4
     7
     8
Run Code Online (Sandbox Code Playgroud)

我正在寻找以下输出

Manager_ID   Count_of_Employees
     1             9
     4             0
     7             3 
     8             0
Run Code Online (Sandbox Code Playgroud)

请注意,您的答案仅给出我所获得的每位经理的直接报告员工数。关于我正在寻找与经理递归的员工报告。在上面的示例中,根据您的查询,我将获得Manager_id 1的数量为3,但我正在寻找的输出为9。提前谢谢!

多谢您的回覆。我终于得到了查询。请找到我的答案。

geo*_*gas 5

首先,有一个重要的注意事项:的第一行Emp_Table,这里Emp_id==Manager_Id==1 不仅无意义,而且还会导致无限递归。我建议您将其删除。

但是,为了提供答案,我首先创建了一个视图,以消除此类无效条目,并使用该视图代替Emp_Table:

create view valid_mng as 
select Emp_Id,Manager_id from Emp_Table
where Emp_Id<>Manager_Id
Run Code Online (Sandbox Code Playgroud)

因此,在递归CTE的帮助下,可以归结为以下内容:

With cte as (
  select Emp_Id,Manager_id from valid_mng
  union all
  select c.Emp_Id,e.Manager_Id 
  from cte c join valid_mng e on (c.Manager_Id=e.Emp_Id)
  )

select m.Manager_Id,count(e.Emp_Id) as Count_of_Employees
from [Execute] m
left join cte e on (e.Manager_Id=m.Manager_Id)
group by m.Manager_Id
Run Code Online (Sandbox Code Playgroud)

如果最终删除了有问题的行,或者最好将其设置Manager_Id=NULL为HABO建议,则只需忽略该valid_mng视图并将其替换为Emp_Table任何地方。

还要注意:Execute在MSSQL中是保留字。避免在用户过时的命名中使用保留字始终是一种好习惯。