【问题标题】:SELECT, GROUP BY and COUNT querySELECT、GROUP BY 和 COUNT 查询
【发布时间】:2020-08-15 22:18:28
【问题描述】:

我在下面有一个示例表,

+-------------+-------------+-------------+----------+------------+---------------------------------+----------+---------------+
| employee_id | first_name  | last_name   | email    | joined_date| title                           | salary   | supervisor_id |
+-------------+-------------+-------------+----------+------------+---------------------------------+----------+---------------+
|         100 | John        | King        | EM1      | 1984-06-17 | CEO                             | 14000.00 |          NULL |
|         101 | Leona       | Kochhar     | EM2      | 1993-09-21 | COO                             | 10000.00 |           100 |
|         102 | Lex         | De Haan     | EM3      | 1992-01-13 | CFO                             | 9000.00  |           100 |
|         103 | Alexander   | Hunold      | EM4      | 2001-04-03 | Gamer                           |  5000.00 |           102 |
|         104 | Dave        | William     | EM5      | 2002-05-21 | Gamer                           |  2000.00 |           103 |
|         105 | David       | Austin      | EM6      | 2002-06-25 | Gamer                           |  2800.00 |           103 |
|         106 | Valli       | Longwind    | EM7      | 2002-02-43 | Gamer                           |  2800.00 |           103 |

某些员工是此表中其他员工的主管。请注意,supervisor_id 是employee_id。

我的任务是只使用 SELECT 语句来获取主管的employee_id、first_name、薪水和主管下的员工总数。

在我看来,我知道我需要使用某种分组和计数。首先, COUNT 每位主管下的员工人数,其次是 GROUP BY 主管 ID。我设法使用这个查询使用简单的 COUNT 和 GROUP BY 获得输出:

SELECT employee_id, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY supervisor_id;

这会输出 supervisor_id 和 supervisor_id 下的员工数量。即:

+---------------+----------------------+
| supervisor_id | COUNT(supervisor_id) |
+---------------+----------------------+
|          NULL |                    0 |
|           100 |                    2 |
|           101 |                    0 |
|           102 |                    0 |
|           103 |                    3 |

*上面的表格略有修改 - 这是一个示例输出

如前所述,supervisor_id 是同一张表中员工的employee_id。我的问题是我无法让这张表显示employee_id、first_name 和salary 以及COUNT 列。最终结果必须显示employee_id(链接到supervisor_id)、first_name、salary、COUNT。

我试过了

SELECT employee_id, first_name, salary, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY employee_id, first_name, salary, supervisor_id;

但这只是返回原始表。

当我尝试这个时

SELECT employee_id, first_name, salary, COUNT(supervisor_id)
FROM EMPLOYEE
GROUP BY supervisor_id;

它返回错误“SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列”,根据网上的说法,这是我制作查询的方式(不能混合聚合列和非聚合列?)。

有人可以指导我吗?谢谢。

【问题讨论】:

  • 提示:在FROM 下的子查询中使用GROUP BY,然后在外部查询中使用JOIN。
  • 这需要递归 CTE 或递归存储过程(如果在数据库中完成)。您使用的是什么版本的 MySQL?如果您设置某种 db/sql fiddle 也会很有帮助。
  • 谢谢戴。基本上我需要在一个查询中加入两个表? @GordonLinoff,我只是从 CMD 提示符下运行它。这实际上是有教育意义的。
  • 上司下的员工总数是指上司下一级还是下级?
  • 我猜是下面的级别 - 基本上任何监督另一个人的员工都会被包括在内。

标签: mysql sql


【解决方案1】:

我猜你在这里只需要自我LEFT JOIN:

https://www.db-fiddle.com/f/miLeekBXxoiVV1SxuTYc2c/0

SELECT s.employee_id, s.first_name, s.last_name, s.salary, COUNT(e.employee_id)
FROM employee s
LEFT JOIN employee e
ON e.supervisor_id = s.employee_id
GROUP BY s.employee_id, s.first_name, s.last_name, s.salary;

顺便说一句,您在评论中提到要使用HAVING COUNT() = 0。您最好不要为此使用HAVING,而只需将此查询更改为INNER JOIN。它将以相同但更有效的方式进行。 https://www.db-fiddle.com/f/gM6q1UyagrZ4e1EHRvJ1NU/0

【讨论】:

  • 您好,这些都在同一张桌子上。 JOIN 是必须的吗?
  • @SunnyBoiz 您是否尝试运行查询?是的 JOIN 是有效的做自联接查询
  • 谢谢亚历克斯。我已经尝试了您的查询并添加了“HAVING”子句来过滤 0。但我认为这在逻辑上有点错误 - COUNT 应该是 COUNTING the supervisor_id 而不是 employee_id。我想对 COUNT 部分的更改应该是正确的?我也在尝试 Dai 关于在 FROM 中使用 GROUP BY 的建议。
  • @SunnyBoiz 这不会是正确的。尝试将s 别名视为主管表,将e 别名视为employee 表。因此,我们选择所有主管,然后计算向该主管报告的所有员工。
【解决方案2】:

请试试这个

SELECT E1.supervisor_id,count(E2.supervisor_id) FROM `EMPLOYEE` AS E1
LEFT JOIN (select supervisor_id FROM EMPLOYEE GROUP BY 
supervisor_id) AS E2 ON E1.supervisor_id = E2.supervisor_id
GROUP BY E1.supervisor_id

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多