SQL-Abfrage: Welcher Berufsgruppe gehören am meisten Mitarbeiter an? Wie viele sind es?
Hier ist die Tabelle:
Das sollte rauskommen:
mein Lösungsansatz:
SELECT job, max(count(empno)) AS ANZAHL_MITARBEITER FROM EMP GROUP BY job ORDER BY ANZAHL_MITARBEITER DESC;
Das hier geht aber ich kann nur alle Jobs mit der Anzahl der MAs ausgeben. Ein Vergleich mit dem Spaltenname ist nicht möglich in meiner SQL-Server version
SELECT job, count(empno) AS ANZAHL_MITARBEITER FROM EMP GROUP BY job ORDER BY ANZAHL_MITARBEITER DESC;
Gibt's dafür eine Lösung?
2 Antworten
Denke das läuft auf analytische Funktionen und ein SELECT außen rum hinaus. Also etwas wie:
SELECT TAB.Job,
TAB.Anzahl_Mitarbeiter
FROM (
SELECT EMP.Job,
COUNT(*) AS Anzahl_Mitarbeiter,
MAX(COUNT(*)) OVER() AS Max_Anzahl_Mitarbeiter
FROM EMP
GROUP BY EMP.Job) TAB
WHERE TAB.Anzahl_Mitarbeiter = TAB.Max_Anzahl_Mitarbeiter
Geht natürlich noch mit etlichen anderen Konstrukten. Verschachtelte SELECTs, mit einer WITH Clause etc. pp.
Je nach SQL Engine halt RANK() OVER() statt MAX(*) OVER() und dann den jeweiligen Rang vergleichen und nicht die Anzahl, sprich Rang #1, bei Sortierung absteigend, also:
SELECT TAB.Job,
TAB.Anzahl_Mitarbeiter
FROM (
SELECT EMP.Job,
COUNT(*) AS Anzahl_Mitarbeiter,
RANK() OVER(ORDER BY COUNT(*) DESC) AS Rang
FROM EMP
GROUP BY EMP.Job) TAB
WHERE TAB.Rang = 1
Die Aggregatfunktion count ist bestimmt richtig.