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 kontinent.Name, COUNT(*) AS Anzahl
  FROM kontinent, land
 WHERE land.KNR = kontinent.KNR
 GROUP BY kontinent.Name

Den Ablauf der Auswertung kann man sich so vorstellen:

Gruppieren
  1. Unsortierte Ausgangsliste.
  2. Die Ergebnisse werden zunächst nach den Gruppierungsattributen (hier nur kontinent.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. Das Gruppierungsattribut wird 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 richtig:

GROUP BY kontinent.KNR

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 land.Name, AVG(ort.Einwohner), MIN(ort.Einwohner), MAX(ort.Einwohner)
  FROM land, ort
 WHERE land.LNR = ort.LNR
   AND land.Name = 'Deutschland'

 

Einschränken der Gruppen

Manchmal sollen nicht alle Gruppen ausgegeben werden. Als Beispiel sollen nur die Kontinente angezeigt werden, für die mehr als 30 Länder erfasst sind:

SELECT kontinent.Name, COUNT(*) AS Anzahl
  FROM kontinent, land
 WHERE land.KNR = kontinent.KNR
 GROUP BY kontinent.Name
HAVING COUNT(*)>30

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 Kenndaten aller Länder, in denen Megastädte (> 10 Mio. Einwohner) liegen:

SELECT land.Name, AVG(ort.Einwohner) AS Durchschnitt, MAX(ort.Einwohner) AS Maximum
  FROM land, ort
 WHERE land.LNR = ort.LNR
 GROUP BY land.Name
HAVING Maximum>10000000
 ORDER BY Maximum DESC

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

Ergebnis der Abfrage

X

Fehler melden

X

Suche