SELECT e.ManagerID,count(*) 作为 NumberOfDepartments
来自 HumanResources.Employee e、Person.Contact c
其中 e.ContactID = c.ContactID
按e.ManagerID分组;
目标是编写一份报告来显示该经理的经理 ID、名字和姓氏以及他们所监管的不同部门的数量。并且只显示管理最多部门的经理。
我必须确保所有员工目前都在受雇(即结束日期不包含日期)。
上面的代码用于显示经理 ID 和他所管理的部门的编号,但是每当我尝试输入名字和姓氏时,我都必须将它们也放在“group by”子句中,这样就可以生成整个报告快要疯了。请帮忙。
Database Here
最佳答案
从您的架构来看,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
表的第一个实例是经理(因为您设置了 其中 e.ManagerID 为 null
),与 Contact
的联接得到您可以获取经理的姓名,Employee
的第二个实例可以获取每位经理管理的所有人员,而与 EmployeeDepartmentHistory
的连接可以获取他们的部门(您所依赖的部门)以及他们的 EndDate
,该值必须为 null
以确保您他们当前处于工作状态。
编辑
请注意我编写连接的方式;在 from
子句中将它们写为逗号分隔的表名称,并在 where
中将连接条件写为 a bad habit that should be kicked ,因为这使得读取、维护和将它们更改为外连接变得更加困难。这就是为什么早在 1992 年就在 SQL 语言中引入了 join
的原因。
关于mysql - 无法弄清楚如何连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43425123/