我有 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/