Fachkonzept - Aggregation

Gruppieren von Ergebnissen

Das Zusammenfassen von Datensätzen ist eine zentrale Funktionalität von SQL.

Das Datenbanksystem kann die Ergebnisse eines SQL-Befehls gruppieren und auf jede Gruppe dann eine Aggregationsfunktion anwenden.

Folgendes Beispiel führt die Anfrage aus dem Einstieg weiter:

SELECT benutzer.PNR, benutzer.Name, COUNT(*) AS Anzahl
  FROM benutzer, mitglied
 WHERE benutzer.PNR = mitglied.PNR
 GROUP BY benutzer.PNR, benutzer.Name

Den Ablauf der Auswertung kann man sich so vorstellen:

Gruppieren
  1. Ausgangssituation - unsortierte Tabelle.
  2. Die Ergebnisse werden zunächst nach den Gruppierungsattributen (benutzer.PNR, benutzer.Name) sortiert.
  3. Im nächsten Schritt werden Gruppen gebildet, die jeweils den gleichen Wert in diesen Attributen haben.
  4. Die Anzahl der Zeilen pro Gruppe werden gezählt.
  5. Die Gruppierungsattribute werden mit der jeweiligen Anzahl ausgegeben.

KlickenKlicke auf die einzelnen Schritte zur Veranschaulichung.

Die Attribute, nach denen gruppiert werden soll, müssen nicht unbedingt angezeigt werden. Im Beispiel oben wäre also auch folgende Gruppierung ausreichend (da die PNR ja eindeutig ist):

SELECT benutzer.Name, COUNT(*) AS AnzahlMitgliedschaften
  FROM benutzer, mitglied
 WHERE benutzer.PNR = mitglied.PNR
 GROUP BY benutzer.PNR

 

Aggregationsfunktionen

Neben dem reinen Zählen der Zeilen einer Gruppe können weitere Aggregationsfunktionen verwendet werden:

Funktion Bedeutung
MIN(Attribut) Minimaler Wert, der für dieses Attribut in der Gruppe angenommen wird.
MAX(Attribut) Maximaler Wert, der für dieses Attribut in der Gruppe angenommen wird.
AVG(Attribut) Durchschnitt (arithmetisches Mittel) aller Werte des Attributs in der Gruppe.
SUM(Attribut) Summe aller Werte des Attributs in der Gruppe.

Als Beispiel kannst du einmal folgenden SQL-Befehl ausführen:

SELECT gruppe.Name, MIN(mitglied.Beitritt), MAX(mitglied.Beitritt), COUNT(*) AS Anzahl
  FROM gruppe, mitglied
 WHERE gruppe.GNR = mitglied.GNR
 GROUP BY gruppe.Name

Hier wird für jede Gruppe bestimmt, wann der erste und der letzte Gruppenbeitritt stattfand.

 

Einschränken der Gruppen

Manchmal sollen nicht alle Gruppen ausgegeben werden. Als Beispiel sollen nur die Gruppen angezeigt werden, bei denen mehr als 100 Benutzer Mitglied sind:

SELECT gruppe.Name, COUNT(*) AS Anzahl
  FROM gruppe, mitglied
 WHERE gruppe.GNR = mitglied.GNR
 GROUP BY gruppe.Name
 HAVING COUNT(*)>100

Der HAVING-Teil der SQL-Anfrage wählt ähnlich wie der WHERE-Teil die Datensätze aus, die angezeigt werden sollen. Allerdings greift er erst nach dem Zusammenfassen der Gruppen und stellt Bedingungen für die berechneten Attributen.

 

Weiteres Beispiel: Ausgabe der Benutzer mit den Anzahlen ihrer Bilder:

SELECT benutzer.Name, COUNT(*) AS Anzahl
  FROM benutzer, bild
 WHERE benutzer.PNR = bild.PNR
 GROUP BY benutzer.PNR
 HAVING Anzahl > 2
 ORDER BY Anzahl DESC

Beachte, dass im HAVING-Teil auch der Alias-Namen des berechneten Attributs verwendet werden kann.

Ergebnistabelle des SQL-Befehls. Es werden nur Benutzer ausgegeben, die mehr als 2 Bilder haben.

X

Fehler melden

X

Suche