2017-10-26 8 views
0

私は2つのテーブルの従業員を持っています(id、first_name、last_name、salary、department_id_、department(id、name))、各部門の従業員数を表示したい 私はここでこの質問をしています:sql部門別従業員数

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

しかし、これは、外では?

+0

。それを 'INNER JOIN'に変更しようとするとどうなるのかを確認してください – xbb

+0

このオプションは私に実際に人がいる部門だけを表示しますが、すべての部門を表示したい人はいません。 ? – Doro

+0

これは無効な標準SQLです。どのDBMSを使用していますか? –

答えて

0

が起こっている理由を任意のアイデアは、あなたはまだ時に結果の行を取得する加入1として、何らかの理由で、私は人々を持っていない部署で、それは従業員の数を示します外部表の一致が見つかりません。すべての従業員列の値のみがNULLです。

レコードをカウントするのではなく、一致するレコード、つまり従業員が見つかってそのデータがnullでないレコードを数えたいとします。したがって、従業員表の列をカウントします(列または式を数えるときは、NULLはカウントされません)。例えば。 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; 

それはあなたがしたいだけ1つの集約列だとして、あなたはSELECT句にサブクエリを移動するので、単純なクエリを取得することができます:

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

代わりCOUNTSUMを使用しても何をしたいあなたを与えることができます。

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フィドル:LEFT JOIN`は何の従業員を持っていないすべての部門にNULL値を持つ行を生成する `使うhttp://sqlfiddle.com/#!9/8b8976/1

関連する問題