mysql - 无法弄清楚如何连接表

标签 mysql sql database

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。这可以解释为什么在添加 firstNamelastName 时,报告会变得疯狂,因为您将按员工的姓名而不是经理的姓名进行分组。

在没有看到表格内容的情况下很难判断,但您可能可以通过填充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/

相关文章:

mysql - 当我的列是 INT(10) 时,为什么我不能插入 10 位数字

.net - 数据库表复制指南

database - SPARQL 查询仅获取最近日期的结果

mysql - DynamoDB 中的最新分区键条目

mysql - 数据库规范化——外键

mysql - 我如何在 SQL 中引用保留字以便它适用于所有常见的数据库系统?

mysql - 创建包含另一个表的列并计算另一个表的值的表

mysql使用查询将记录注入(inject)表

php - MySQL/PHP 优化 - 基于客户数据的积分

php - 需要 future 7 天内包含日期的所有 MySQL 行,但日期列的格式不正常