Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sql按部门划分的员工人数_Mysql_Sql - Fatal编程技术网

Mysql sql按部门划分的员工人数

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

我有两个表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 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;