2017-02-17 8 views
-1

Anforderungen: Verwenden nur einer Abfrage, um jede Abteilung mit ihren Mitarbeiterzahlen (zwei Tabellen, Abteilung und Mitarbeiter) anzuzeigen; Reihenfolge nach Anzahl der Mitarbeiter rückläufig (für Abteilungen ohne Mitarbeiter, immer noch zeigen); Für Abteilungen mit der gleichen Größe alphabetisch nach Abteilungsnamen sortieren. Meine Lösung zeigt nicht die Abteilungen ohne Angestellte, auch, es ist nicht alphabetisch Reihenfolge der Abteilungen zeigt, wenn gleiche Anzahl der Mitarbeiter:sql, Mitarbeiter und Abteilung

SELECT d.DEPT_ID, 
    DEPT_NAME, COUNT(s.STUDENT_ID) as numStudents 
    FROM Departments d, Students s 
    WHERE d.DEPT_ID = s.DEPT_ID 
    GROUP BY d.DEPT_ID 
    ORDER BY numStudents DESC; 

Antwort

0

Verwenden Sie einen LEFT JOIN anstelle des Kreuzes verbinden Sie gerade tun.

SELECT d.DEPT_ID, 
d.DEPT_NAME, COALESCE(COUNT(s.STUDENT_ID),0) as numStudents 
FROM Departments d, 
LEFT JOIN Students s 
    ON s.dept_id = d.dept_id 
GROUP BY d.DEPT_ID, d.dept_name 
ORDER BY numStudents DESC, DEPT_NAME; 
0

Um Abteilungen ohne Studenten zu zeigen, haben Sie LEFT JOIN zu verwenden, kein Kreuzprodukt. Um nach Namen zu suchen, wenn sie die gleiche Anzahl von Schülern haben, müssen Sie das zu Ihrer ORDER BY Klausel hinzufügen.

SELECT d.DEPT_ID, DEPT_NAME, IFNULL(COUNT(s.STUDENT_ID), 0) AS numStudents 
FROM Departments AS d 
LEFT JOIN Students AS s ON d.DEPT_ID = s.DEPT_ID 
GROUP BY d.DEPT_ID 
ORDER BY numStudents DESC, DEPT_NAME 
Verwandte Themen