Mysql sql按部门划分的员工人数
我有两个表employees(id、first_name、last_name、salary、department_id_)和department(id、name),我想显示每个部门的员工数量。 我有一个问题:Mysql sql按部门划分的员工人数,mysql,sql,Mysql,Sql,我有两个表employees(id、first_name、last_name、salary、department_id_)和department(id、name),我想显示每个部门的员工数量。 我有一个问题: SELECT department.name, COUNT(*) AS 'employees_number' FROM department LEFT JOIN employees ON employees.department_id = department.id GROUP BY de
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, 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;
使用
SUM
而不是COUNT
也可以满足您的需求:
SELECT
department.name,
SUM(CASE WHEN employees.id IS NOT NULL THEN 1 ELSE 0 END) AS 'employees_number'
FROM department
LEFT JOIN employees
ON employees.department_id = department.id
GROUP BY department.id, department.name;
SQL Fiddle:
使用
左联接
将为没有员工的任何部门生成一个空值行。尝试将其更改为内部联接
查看发生了什么情况。此选项仅显示我实际有人员的部门,但我想显示所有部门,如果没有人员,则应显示0,是否为possible?这是无效的标准SQL。您使用的是哪种DBMS?phpMyAdmin………..带有“invalid”,一个带有“no”名称的“horse”顺便说一句,它指的是您的引号。它应该是双引号(如果有)对于名称。单引号表示字符串文本。phpMyAdmin不是DBMS。它是数据库的GUI。我想您使用的是MySQL,这将是phpMyAdmin使用的典型DBMS。
SELECT
department.name,
SUM(CASE WHEN employees.id IS NOT NULL THEN 1 ELSE 0 END) AS 'employees_number'
FROM department
LEFT JOIN employees
ON employees.department_id = department.id
GROUP BY department.id, department.name;