2016-11-03 12 views
2

私のソリューションが動作していない理由はわかりません。合計とSQLの結合

私はデータベース内の部門別に従業員数を数えようとしています。

は、次の2つのテーブルがあります。

CREATE TABLE DEPARTMENT 
(
    NAME VARCHAR(32) NOT NULL, 
    ID INT NOT NULL PRIMARY KEY 
); 

CREATE TABLE EMPLOYEE 
(
    NAME VARCHAR(32) PRIMARY KEY NOT NULL, 
    DEPARTMENT INT NOT NULL REFERENCES DEPARTMENT(ID) 
); 

と私は部門の従業員の数を表示するビューを作成しました。

CREATE 
OR REPLACE VIEW VIEW_NB AS 
SELECT 
    DEPARTMENT.NAME AS DEPARTEMENT, 
    count(*) AS nb 
FROM 
    DEPARTMENT 
    LEFT JOIN 
     EMPLOYEE 
     ON DEPARTMENT.ID = EMPLOYEE.DEPARTMENT 
GROUP BY 
    DEPARTMENT.ID, 
    DEPARTMENT.NAME; 
SELECT 
    ADD_DEPARTMENT('FRANCE', 10); 
SELECT 
    ADD_DEPARTMENT('SPAIN', 100); 
SELECT 
    ADD_EMPLOYEE('JOSE', 10); 

結果は

departement | nb 
-------------+---- 
FRANCE  | 1 
SPAIN  | 1 

ですが、それは私が左の加入を使用する必要性を理解し

departement | nb 
-------------+---- 
FRANCE  | 0 
SPAIN  | 1 

でなければなりません。 私のビューには、従業員がいなくても、すべての部門に対して少なくとも1人の従業員がいます。

私は何かを見逃しましたか?もしあれば何?

答えて

1

これは動作するはずです:あなたが意味し、*を使用しているため

SELECT DEPARTMENT.NAME AS DEPARTEMENT, count(EMPLOYEE.DEPARTMENT) AS nb 
FROM DEPARTMENT 
LEFT JOIN EMPLOYEE 
ON DEPARTMENT.ID = EMPLOYEE.DEPARTMENT 
GROUP BY DEPARTMENT.ID, DEPARTMENT.NAME; 

あなたはカウントとして1を取得している理由がある - に関係なく、データを1として任意のレコードをカウントしません。 COUNT()はデフォルトでNULLを無視しているため、その内部に正しい(詳細)テーブルの列を提供するだけで済みます。

SELECT DEPARTMENT.NAME AS DEPARTEMENT, count(EMPLOYEE.DEPARTMENT) AS nb 
               ^^^^^^^^^^^^^^^^^^ 
1

変更最初の行

SELECT DEPARTMENT.NAME AS DEPARTEMENT, count(*) AS nb 
FROM DEPARTMENT 
LEFT JOIN EMPLOYEE 
ON DEPARTMENT.ID = EMPLOYEE.DEPARTMENT 
GROUP BY DEPARTMENT.ID, DEPARTMENT.NAME; 

あなたは "外側" のテーブルから行をカウントする必要があります。集計はNULL値を無視するため、employeeテーブル内で一致しなかった行は、count()関数によって無視されます。

SELECT department.name AS departement, 
     count(employee.department) AS nb 
FROM department 
    LEFT JOIN employee ON department.id = employee.department 
GROUP BY department.id, 
     department.name; 
1

TO