我正在寻找一个 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
执行 table :
这张表不过是选定的经理在这里可用。我需要得到这个经理下每个员工的人数
Manager_id
1
4
7
8
我正在寻找以下输出
Manager_ID Count_of_Employees
1 9
4 0
7 3
8 0
请注意,您的回答仅提供了我得到的每位经理的直接下属员 worker 数。 Bout 我正在寻找与经理的递归员工报告。在我上面的示例中,根据您的查询,我将获得 Manager_id 1 计数为 3,但我正在寻找输出为 9。提前致谢!
感谢您的所有回复。我终于得到了查询。请找到我的答案。
最佳答案
首先,一个 重要提示 : 第一排Emp_Table
,其中 Emp_id==Manager_Id==1
不仅没有意义还会造成无限递归 .我建议你删除它。
然而,为了提供答案,我首先创建了一个消除此类无效条目的 View ,并使用它代替了 Emp_Table
:
create view valid_mng as
select Emp_Id,Manager_id from Emp_Table
where Emp_Id<>Manager_Id
所以它归结为以下,在递归 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
如果您最终删除了违规行,或更好的设置
Manager_Id=NULL
正如HABO所建议的 ,只需忽略 valid_mng
查看并将其替换为 Emp_Table
到处。另附注:
Execute
是 MSSQL 中的保留字。避免在用户对象命名中使用保留字始终是一个好习惯。
关于SQL查询以获取每个经理下员工的递归计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19690325/