从您的模式,似乎在Employee
的managerID
列都将填充经理对于员工的ID。这可以解释为什么当添加firstName
和lastName
时,报告变得很疯狂,因为您将按员工姓名而非经理人进行分组。
没有看到表格内容很难说,但你可能会认为不是有managerID
填充。
如果是这样的话,你可以写这样的查询
select e.EmployeeID, c.firstName, e.lastName, count(distinct edh.DepartmentID)
from Employee e
join Contact c
on e.ContactID = c.ContactID
join Employee e2
on e1.EmployeeID = e2.ManagerID
join EmployeeDepartmentHistory edh
on e2.EmployeeID = edh.EmployeeID
where e.ManagerID is null and edh.EndDate is null
group by e.EmployeeID, c.firstName, e.lastName
Employee
表的第一个实例是管理者(因为你设置where e.ManagerID is null
),连接与Contact
让你的经理的名字,Employee
的第二个实例可让您获得由每位经理管理的所有人员,并且加入EmployeeDepartmentHistory
可让您获得他们的部门(您指望)和他们的EndDate
,这必须是null
以确保他们目前处于就业状态。
编辑
请注意我写的连接方式;把它们写成你的from
子句中的逗号分隔表名,中的连接条件是a bad habit that should be kicked,因为它使得阅读,维护和更改它们更加困难。这就是为什么join
在SQL语言于1992年
(一)如何你能认识一个经理吗? –
(b)经理必须当前被占用,您没有在查询中添加此项。 –
如果managerID中有值,则表示他/她是经理 – Obi