2016-08-03 7 views
3

Ich habe folgenden TabellenCOUNT als 0 abrufen, wenn JOIN Wert

Geschlecht

+----+-------------+ 
| ID | Description | 
+----+-------------+ 
| 1 | M   | 
| 2 | F   | 
+----+-------------+ 

Abteilung

+----+-------------------+ 
| ID | DepartmentName | 
+----+-------------------+ 
| 1 | Application  | 
| 2 | Change Management | 
| 3 | Infrastructure | 
+----+-------------------+ 

Mitarbeiter

nicht zurück
+----+----------+----------+-------------+--------------+ 
| ID | Name | GenderID | StaffNumber | DepartmentID | 
+----+----------+----------+-------------+--------------+ 
| 1 | Stephen |  1 | SC001  |   1 | 
| 2 | Jacob |  1 | SC002  |   1 | 
| 3 | Maria |  2 | SC003  |   1 | 
| 4 | Valerie |  2 | SC004  |   1 | 
| 5 | Herman |  1 | SC005  |   3 | 
| 6 | Trevor |  1 | SC006  |   3 | 
| 7 | Mark  |  1 | SC007  |   2 | 
| 8 | Hendrick |  1 | SC008  |   2 | 
+----+----------+----------+-------------+--------------+ 

Ich möchte herausfinden, die Gesamtzahl der Mitarbeiter nach Departement & Geschlecht gruppiert. Wenn für eine Abteilung kein Geschlecht existiert, möchte ich immer noch das Geschlecht mit 0 als Zählung angeben.

habe ich versucht, diese SQL, aber es abrufen nicht, was ich will:

SELECT 
    e.DepartmentID, 
    e.GenderID, 
    COUNT(e.ID) AS TotalEmp 
FROM 
    Employee e 
     RIGHT OUTER JOIN Gender g 
      ON e.GenderID = g.ID 
GROUP BY 
    e.DepartmentID, 
    e.GenderID 
ORDER BY 
    e.DepartmentID, 
    e.GenderID 

Aktuell Ergebnis

+--------------+----------+----------+ 
| DepartmentID | GenderID | TotalEmp | 
+--------------+----------+----------+ 
|   1 |  1 |  2 | 
|   1 |  2 |  2 | 
|   2 |  1 |  2 | 
|   3 |  1 |  2 | 
+--------------+----------+----------+ 

Erwartetes Ergebnis

+--------------+----------+----------+ 
| DepartmentID | GenderID | TotalEmp | 
+--------------+----------+----------+ 
|   1 |  1 |  2 | 
|   1 |  2 |  2 | 
|   2 |  1 |  2 | 
|   2 |  2 |  0 | 
|   3 |  1 |  2 | 
|   3 |  2 |  0 | 
+--------------+----------+----------+ 
+0

können Sie bitte eine sqlfiddle erstellen? – Jens

+0

Zuallererst: Sie sollten immer 'left join' verwenden. Auch wenn Sie mit 'e.GenderID' gruppiert sind, ändern Sie es in' g.GenderID'. –

+3

Tipp von heute: vergessen Sie nicht richtig beizutreten. Verwenden Sie stattdessen "LINKE VERBINDUNG"! Gleiche Funktionalität, aber eine sinnvolle Tabellenreihenfolge. ("main table left join optionale Daten", anstatt "optionale Daten rechts Join Haupttabelle".) – jarlh

Antwort

5

mit Try this :

select d.DepartmentID,g.ID, COUNT(e.ID) AS TotalEmp 
    from Gender g 
    cross join Department d 
    left join Employee e on e.genderid=g.id and e.departmentid=e.DepartmentID 
    group by d.DepartmentID,g.id; 
+0

Sehen Sie eine Abteilungstabelle im Fragenpost? –

+0

Ja, es gibt eine Abteilung Tabelle in der Frage – Sanghita

+0

@TedoG. Ja, es ist da. – ughai