SELECT e.ManagerID, count(*) as NumberOfDepartments
From HumanResources.Employee e, Person.Contact c
where e.ContactID = c.ContactID
group by e.ManagerID;
目标是编写一份报告,以显示该经理的经理人姓名,名字和姓氏以及他们监督的独特不同部门的数量。并且只显示监督大多数部门的经理。
我必须确保所有员工目前都在工作(即enddate不包含日期)。
上面的代码正在显示他运行的managerID和部门的编号,但每当我尝试输入名字和姓氏时,我也必须将它们放在'group by'子句中,这样就可以生成整个报告快要疯了。请帮助。
Database Here
答案 0 :(得分:1)
在您的架构中,似乎managerID
中的Employee
列中填充了该员工的经理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
子句中将它们写为逗号分隔的表名称,where
中的连接条件为a bad habit that should be kicked,因为它使得读取,维护和更改它们更加难以加入外连接。这就是1992年在SQL语言中引入join
的原因。
答案 1 :(得分:1)
在MSSQL中:
SELECT e.ManagerID, e.FirstName, e.LastName, COUNT(*) AS NumberOfDepartments FROM HumanResources.Employee e
INNER JOIN Person.Contact c ON e.ContactID=c.ContactID
GROUP BY e.ManagerID, e.FirstName, e.LastName
如果在MySql中需要它,请将ON更改为WHERE模式,将INNER JOIN更改为JOIN