Grundkurs SQL

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!