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。提前谢谢!
多谢您的回覆。我终于得到了查询。请找到我的答案。
首先,有一个重要的注意事项:的第一行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中是保留字。避免在用户过时的命名中使用保留字始终是一种好习惯。