【问题标题】:query to find number of employees under each manager查询每个经理下的员工人数
【发布时间】:2018-09-23 16:58:38
【问题描述】:

我有一个包含以下列的 Employee 表:Id、Name、Manager_Name

我需要列出:每个经理手下的员工人数。

如何形成一个简单的sql查询来实现结果?

注意:可能有两个同名的经理。

表:- 创建表employee_test (Id int, Name VARCHAR(100), Manager_Name varchar(100));

输入:

 ID NAME   MANAGER_NAME
 -- ------ ------------
  1 deep   hari
  2 mitra  hari
  3 hari   kishan
  4 kirti  kishan
  5 kishan amit
  6 jumeet hari
  7 fareed deep
  8 stuti  kishore

我的尝试:-

选择 m.Name 作为 ManagerName,count(e.Name) 作为 employeesCount FROM employee_test e INNER JOIN employee_test m ON e.Manager_Name = m.Name 按 m.Name 分组

我的输出:-

 MANAGERNAME EMPLOYEESCOUNT
 ----------- --------------
 kishan                   2
 hari                     3
 deep                     1

但它不考虑其他经理的员工人数?

更新:- 我也不太清楚,因为面试官确切地问了这个问题,请求结束这个问题。

【问题讨论】:

  • 您正在加入该表。然后有一个外键。请将其添加到示例中。
  • 请在代码块中格式化代码,就像你做表格一样。始终检查帖子的格式化版本。如果 ids 识别人,你为什么用名字来识别经理?名字也能识别经理吗?了解您应该声明哪些 PK/UNIQUE。还要了解您应该声明的 FK——当列列表的值必须在其他地方显示为 PK/UNIQUE 时。还请阅读minimal reproducible example 并采取行动--如果您的输入表也不是格式化代码,请为它们提供代码。 Google stackoverflow 帮助回复sqlfiddle.com.
  • 结果中的 amit 和 kishore 在哪里? minimal reproducible example 你为什么要求可以由 e 行和 m 组成的行,其中经理姓名等于员工姓名?为什么不只是对经理姓名进行分组?您自行加入的唯一原因是名称是标识符(无论如何都必须如此,因为这就是您关联员工和经理的方式)并且您想获取经理 ID。但是这个表没有给出所有经理名字的 id,所以你不能从这个表的自联接中得到它。无论如何,自联接不是您要分组的表。解释为什么要像以前那样编写代码。
  • 如果“可能有两个同名经理”,则无法使用此表获取“每个经理下的员工数量”,因为它没有提供员工的经理 ID。您只能获取每个经理姓名下的员工数量。
  • 您可以删除您的帖子,点击“删除”。 “关闭”意味着在人们投票“重新打开”之前阻止发布答案,尽管人们仍然可以投票和评论。您可以使用 site:stackexchange.com 和 site:meta.stackoverflow.com 搜索协议和帮助问题。您可以在这些站点上发布有关协议和帮助的问题。您可以标记帖子以向版主发送消息。但是你能纠正/澄清你的问题吗?--MANAGER_NAME 应该是 MANAGER_ID 吗?每个 MANAGER_ID 值都应该是一个 ID 值吗?是否应该有从 MANAGER_ID 到 ID 的 FK? MANAGER_ID 可以为 NULL 表示没有经理吗?

标签: sql self-join


【解决方案1】:

除了MJH的回应,如果可以有两个同名的经理,就需要有办法区分他们。

假设您有以下(在 SQL Server 中):

create table Employee (Name VARCHAR(100), Manager_Id INT)
create table Managers (Id INT, Name VARCHAR(100))

SELECT d.Manager_Name, d.employeesCount 
FROM(
    SELECT m.Id, m.Name as Manager_Name, count(e.Name) as employeesCount
    FROM Employee e
    INNER JOIN Managers m ON e.Manager_Id = m.Id
    group by Id, m.Name 
) d

【讨论】:

  • 在我看来,他说的是一个表,因为他说“自我加入”。但是,没有任何外键。我不明白。
  • @TheImpaler,你不需要需要 fk的加入。 (它们的主要目的是确保数据的一致性。)
  • 他正在加入自己的桌子。然后,那里有一个“未声明的”外键。需要添加它才能使示例有意义。我不认为这是两个单独的表。
  • @TheImpaler 约束不需要理解(解释)(查询或更新)数据库。他们让 DBMS 拒绝已知的无效状态/情况。我同意有时 SQL/English 查询仅在某些约束成立的情况下才有意义。然后在其域之外调用部分函数(例如标量子查询)的查询将没有意义,但其他人仍然会。但是这里不是从 MANAGER_NAME 到 NAME 的 FK,因为 amit 和 kishore 不是该表给出的任何类型的 NAME。该问题不需要自加入!然而,它的自连接意味着什么。
  • 是的,这就是我所说的。 FK 约束的缺乏允许一个不可能的例子。如果 Deepak 已经添加了约束,那么这个问题会更好地表述。
【解决方案2】:

我想你想要这个:

select Manager_Name, count(Name)
from Employee
group by Manager_Name

【讨论】:

  • 我会使用count(*) 而不是count(name),但我认为这是正确的。无需自我加入。
  • @The Impaler 通常情况下,我倾向于同意,但如果经理没有员工怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2020-01-27
  • 2019-11-02
  • 1970-01-01
相关资源
最近更新 更多