2016-11-03 5 views
2

Ich verstehe nicht, warum meine Lösung nicht funktioniert.Summe und Join in Sql

Ich versuche, die Anzahl der Mitarbeiter nach Abteilung in einer Datenbank zu zählen.

Es gibt zwei Tabellen:

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) 
); 

und ich habe einen Blick zu zeigen, die Anzahl der Mitarbeiter in Abteilungen geschaffen.

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); 

Ergebnis ist

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

aber es sollte

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

ich verstehen die Notwendigkeit, verwenden links verbindet. Allerdings hat meine Ansicht mindestens 1 Mitarbeiter für jede Abteilung, auch wenn sie keinen Mitarbeiter haben.

Habe ich etwas übersehen? Wenn ja was?

Antwort

1

sollte diese Arbeit:

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; 

Der Grund sind Sie 1 als Zählung bekommen, weil Sie * verwendet, was bedeutet - ganz gleich, um die Daten auf einen Eintrag als 1 zählen. COUNT() ignorieren Sie standardmäßig NULL, so dass Sie nur eine der richtigen (Detail-) Tabellenspalten darin eingeben müssen.

1

ändern erste Zeile

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

TO

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

Sie müssen die Zeilen aus der "äußeren" Tabelle zählen. Da Aggregate NULL-Werte zu ignorieren, die Zeilen, die nicht taten haben eine Übereinstimmung in der employee Tabelle wird durch die count() Funktion ignoriert werden:

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;