4.4 Daten gruppieren
Bisher haben wir nur einzelne Werte als Ergebnis unserer Abfragen mit Aggregatfunktionen erhalten. Wie wir Durchschnittswerte einer kompletten Spalte berechnen, ist uns inzwischen bekannt. Wenn Sie den durchschnittlichen Lohn aller Mitarbeiter der Firma wissen wollen, dann erfolgt dies leicht mit den Anweisungen, die wir in dem letzten Abschnitt gelernt haben.
Nun wollen wir aber bestimmte Mitarbeitergruppen in diesem Punkt vergleichen, und da wäre es ein wenig aufwändig, viele einzelne SQL-Anweisungen einzugeben und das Ergebnis auf einem Blatt Papier zu notieren. Deshalb gibt es eine Anweisung die wir gleich näher beschreiben.
Mit Hilfe des ORDER BY
Schlüsselwortes können wir beispielsweise die
Mitarbeiter nach ihrer Position sortieren lassen und dann einzeln durchzählen (einer
in der Position 1, zwei haben die Position 3 inne, usw.).
Eine sehr mühsame Methode:
[21]SELECT name AS Nachname, position AS PositionsID
FROM tbl_mitarbeiter
ORDER BY position
Es geht auch einfacher, wie Sie sich sicher denken können. Mit der Anweisung GROUP BY
ist es in SQL möglich das Abfrageergebnis nach bestimmten Kriterien zusammenzufassen. In unserem Beispiel bildet
GROUP BY position
in der resultierenden Liste für jeden gleichen
Inhalt der angegebenen Spalte eine Gruppe. Dadurch wird in der obigen Abfrage aus den Elementen, die
den gleichen Wert im Attribut position haben, eine Zeile (Die Attribute werden zu einer einzelnen Zeile
verdichtet
).
[8]SELECT name AS Nachname, position AS PositionsID
FROM tbl_mitarbeiter
GROUP BY position
Beachten Sie, dass der Inhalt der ausgegebenen Spalte name zufällig ist. Es wird irgendein Inhalt
aus der jeweiligen Gruppe angezeigt. Das Ganze liefert uns wenig sinnvolle Informationen. Es ist daher nicht
nötig und zweckmäßig in der SELECT
-Anweisung andere Spalten auszugeben als in der
GROUP BY
-Anweisung angegeben sind. In den meisten SQL-Dialekten führt dies sogar zu einer
Fehlermeldung!
Das Ausgeben der Spalte name in unserem Beispiel ist also Unsinn!
Wir merken uns:
Außer den Feldern nach denen in der GROUP BY
-Anweisung gruppiert wird
sind keine weiteren Feldnamen in der SELECT-Zeile zulässig, es sei denn auf diese wird eine Aggregatfunktion
angewendet!
Dies ist bei genauer Betrachtung auch leicht einzusehen: Was soll der Name in dieser Liste für einen Sinn machen, nach welchen Regeln sollte er ausgewählt werden?
Unser erstes Beispiel hat gezeigt, dass die GROUP BY-Anweisung zum Zusammenfassen
von Datensätzen dient. Besonders interessant ist die damit erhaltene Information allerdings nicht. Mit GROUP
BY
allein ist also noch nicht viel gewonnen – es sei denn Sie wollten
lediglich eine Liste aller Positionen erstellen.
Viel interessanter wird es nun, wenn die einzelnen Gruppen durch statistische Funktionen
(Aggregatfunktionen) ausgewertet werden. Gerade diese Funktionen machen GROUP BY
zu einem
wichtigen Werkzeug.
Wollen wir also beispielsweise die Anzahl der Mitarbeiter ermitteln, welche eine bestimmte Position bekleiden, so hilft uns die folgende Anweisung:
[8]SELECT COUNT(*) AS Anzahl, position AS PositionsID
FROM tbl_mitarbeiter
GROUP BY position
Versuchen Sie selbst nun noch mit einem geeigneten JOIN
herauszufinden, was sich hinter den
PositionsID's verbirgt!