mysql - 按部门划分的员工 SQL 数量

标签 mysql sql

我有 2 个表员工(id,first_name,last_name,salary,department_id_和department(id,name),我想显示每个部门的员 worker 数。

我在这里有这个问题:

SELECT department.name, COUNT(*) AS 'employees_number'
FROM department
LEFT JOIN employees
ON employees.department_id = department.id
GROUP BY department.id, department.name;

但由于某种原因,在我没有人员的部门中,它显示员工数量为 1。知道为什么会发生这种情况吗?

最佳答案

使用外部联接,当外部表中未找到匹配项时,您仍然会获得结果行。只有所有员工列值为空。

因此,您不想对记录进行计数,而是要对匹配的记录进行计数,即找到员工且其数据不为空的位置。因此,对员工表中的列进行计数(在对列或表达式进行计数时,不计算空值)。例如。使用 COUNT(e.department_id)COUNT(e.id):

SELECT d.name, COUNT(e.id) AS employees_number
FROM department d
LEFT JOIN employees e ON e.department_id = d.id
GROUP BY d.id, d.name;

不过,我更喜欢的是在加入之前进行聚合/计数。该查询看起来有点复杂,但在将来的查询更改时不太容易出错:

SELECT d.name, COALESCE(e.how_many, 0) AS employees_number
FROM department d
LEFT JOIN
(
  SELECT department_id, COUNT(*) AS how_many
  FROM employees
  GROUP BY department_id
) e ON e.department_id = d.id;

由于它只是您想要的一个聚合列,因此您可以将子查询移至 SELECT 子句,从而获得更简单的查询:

SELECT 
  d.name,
  (
    SELECT COUNT(*)
    FROM employees e
    WHERE e.department_id = d.id
  ) AS employees_number
FROM department d;

关于mysql - 按部门划分的员工 SQL 数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46956347/

相关文章:

mysql - 带求和的 SQL 查询条件

python - 在 SQL 查询中多次使用同一变量。 Python 代码?

sql - 如何从与外部查询连接的 COUNT 子查询设置列值?

MYSQL:列计数与第 1 行的值计数不匹配无法弄清楚

php - 为什么 Laravel 5.6 中没有删除数据表记录

jquery - 流程图从mysql ajax js中提取数据

mysql - 棘手的 MySQL JOIN 查询

sql - PostgreSQL:表仅引用复合主键的一部分

mysql - 使用其他表中的值之和更新 sql 表中的记录

php - Mysql选择最后添加的5个并使它们成为rand