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

标签 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

执行 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/

相关文章:

sql - 在更新特定列后更新某些列的触发函数

mysql - 当一行可能链接到多个表时...我该怎么办?

entity-framework - Entity Framework 是否使用默认的初始目录?它做了哪些假设?

mysql - 在两个新表中将表合并为一个具有相同生成编号的表

sql - 如何检查数据库中是否存在 View ?

sql - 数据库推荐

sql-server - sql server 中给定月份的最后一个星期五

sql-server - Excel.Application 不能使用 SQL 作业在 PowerShell 中运行,但可以从命令行运行

c# - 使用 C# 制作 SQL Server 插件

sql - 通配符 '%' ,在 ColdFusion cfscript 查询 LIKE 语句中?