Zurück zur Artikelliste Artikel
4 Leseminuten

Wie man Aggregatfunktionen in der WHERE-Klausel verwendet

Das Filtern von Daten nach dem Ergebnis einer Aggregatfunktion ist eine häufige Aufgabe bei der Datenanalyse. Wie verwendet man also Aggregate in der WHERE Klausel? Der Beantwortung dieser Frage widmen wir diesen ganzen Artikel.

Das Kombinieren von Aggregatfunktionen und das Filtern auf der Grundlage ihrer Ergebnisse wird häufig in der Datenanalyse verwendet - z. B. das Anzeigen von Filialen, deren Gesamtumsatz über X liegt, von Ländern, in denen die Anzahl der Stellen unter Y liegt, von Studenten, deren Durchschnittsnote unter Z liegt, und so weiter.

Neuere SQL-Benutzer versuchen oft, eine solche Filterung in der WHERE -Klausel vorzunehmen. Aber wie wir in diesem Artikel sehen werden, ist das keine brauchbare Lösung.

Sehen wir uns also an, wie Sie die gewünschten Ergebnisse erhalten können. Zunächst werfen wir jedoch einen Blick auf unseren Datensatz. In diesem Fall basiert das Beispiel auf Daten aus dem European Climate Assessment & Dataset.

Beispiel Daten

Unser Datensatz besteht nur aus einer Tabelle: temperature_data. Sie speichert Informationen über die tägliche Höchsttemperatur in verschiedenen Städten. Die Spalten sind:

  • id - Die ID der aufgezeichneten Temperatur.
  • city - Die Stadt, in der die Temperatur aufgezeichnet wurde.
  • date - Das Datum, an dem die Temperatur aufgezeichnet wurde.
  • temperature - Die höchste aufgezeichnete Temperatur (in Grad Celsius).

Zur besseren Veranschaulichung sind hier alle Daten aus der Tabelle aufgeführt.

idcitydatetemperature
1Szczecin2022-05-3118.60
2Szczecin2022-05-3017.20
3Szczecin2022-05-2916.40
4Szczecin2022-05-2814.70
5Szczecin2022-05-2717.00
6Rotterdam2022-05-3118.40
7Rotterdam2022-05-3014.50
8Rotterdam2022-05-2914.50
9Rotterdam2022-05-2815.80
10Rotterdam2022-05-2716.10
11Berlin2022-05-3121.00
12Berlin2022-05-3017.50
13Berlin2022-05-2915.20
14Berlin2022-05-2816.30
15Berlin2022-05-2718.50

Eine Aggregatfunktion in der WHERE-Klausel?

Ich möchte mit diesen Daten die durchschnittliche Höchsttemperatur nach Stadt ermitteln und nur die Städte mit einer Durchschnittstemperatur von über 16°C anzeigen.

Neue Analysten könnten die Abfrage unter Verwendung der Aggregatfunktion AVG() in der Klausel WHERE schreiben:

SELECT city,
	 AVG(temperature) AS average_max_temperature
FROM temperature_data
WHERE AVG(temperature) > 16
GROUP BY city;

Zunächst ermitteln wir die durchschnittliche Höchsttemperatur nach Stadt. Dann verwenden wir dieses Ergebnis in der WHERE Klausel; das scheint in etwa richtig zu sein. Aber diese Abfrage gibt einen Fehler aus!

Verwendung von Aggregatfunktionen in der WHERE-Klausel

Und dieser Fehler beantwortet ganz eindeutig die Frage, wie man Aggregatfunktionen in der WHERE Klausel verwendet: gar nicht!

Aggregatfunktionen sind nicht erlaubt, da die WHERE Klausel zum Filtern von Daten vor der Aggregation verwendet wird. WHERE ist zwar nicht für die Aggregation gedacht, hat aber andere Verwendungszwecke.

Um Daten basierend auf einem Aggregatfunktionsergebnis zu filtern, müssen Sie die HAVING Klausel verwenden.

Aggregatfunktionen in der HAVING-Klausel verwenden

Es ist einfach, die obige Abfrage zu korrigieren: Sie müssen nur WHERE durch HAVING ersetzen. Die HAVING-Klausel wird zum Filtern von Daten verwendet, ähnlich wie WHERE. Der Hauptunterschied zwischen WHERE und HAVING ist, dass HAVING Daten nach der Aggregation filtert. Wenn Sie also Code schreiben, müssen Sie darauf achten, dass die HAVING-Klausel nach der GROUP BY kommt. Das hat etwas mit der Reihenfolge der Operationen in SQL zu tun.

Schreiben wir unsere frühere Abfrage neu, entfernen WHERE und fügen HAVING hinzu (natürlich nach GROUP BY!):

SELECT city,
	 AVG(temperature) AS average_highest_daily_temperature
FROM temperature_data
GROUP BY city
HAVING AVG(temperature) > 16;

Auch hier wählen wir die Stadt aus und ermitteln die Durchschnittstemperatur mit der Funktion AVG(). Jetzt werden die Daten jedoch nach Städten gruppiert und mit der HAVING Klausel gefiltert, um nur Durchschnittswerte über 16 anzuzeigen.

cityaverage_highest_daily_temperature
Szczecin16.78
Berlin17.70

Von den ursprünglichen Daten bleiben die Städte Szczecin und Berlin übrig, da ihre durchschnittliche Tageshöchsttemperatur über 16 °C liegt.

Aggregatfunktionen und Filterung gehen Hand in Hand, aber nicht in der WHERE-Klausel

Das Wissen, dass Sie die Aggregatfunktionen nicht in der WHERE Klausel verwenden können, ist nur die halbe Antwort. Natürlich brauchen Sie immer noch eine Möglichkeit, die Ausgabe der Aggregatfunktionen zu filtern. Die HAVING Klausel ist diese Möglichkeit!

Beide Klauseln sehen recht ähnlich aus, vor allem weil die Art und Weise, wie Sie eine Bedingung einrichten, dieselbe ist. Wichtig ist hier jedoch, dass Sie wissen, dass die Aggregatfunktionen in HAVING, nicht aber in WHERE verwendet werden können.

Damit Ihnen dieser Unterschied klar wird, müssen Sie viel Code schreiben. Und dafür brauchen Sie eine Menge Beispiele, und genau darum geht es in unserem SQL-Praxis Kurs ist genau das, worum es geht.