Filtern und Sortieren

In der 1. Lektion haben wir das Filtern von Daten mit der WHERE-Klausel gelernt. Daten die so gefiltert werden, werden nicht mit aggregiert. Die Filterung findet vorher statt. Wenn wir also auf das Ergebnis einer Aggregation filtern möchten, müssen wir das irgendwie anders machen.

Filtern von aggregierten Daten mit der HAVING-Klausel

Mit dem Schlüsselwort HAVING können wir ein Prädikat einleiten, dass Aggregatfunktionen nutzt. Also beispielsweise die aufsummierten Werte einer Gruppierung vergleicht. Wenn wir die IDs aller Bearbeiter sehen möchten, die mehr als 100 Tage Aufwand haben, dann können wir das so machen:

SELECT assignee, 
       SUM(effort) AS effort_total
  FROM tasks
 GROUP BY assignee
 HAVING SUM(effort) > 100

Wir können uns leider nicht auf den zuvor in der Feldliste definierten Namen der Spalte EFFORT_TOTAL beziehen. Statt dessen müssen in unserer HAVING-Klausel die Aggregatfunktion noch einmal wiederholen. Das bedeutet andererseits: Wir können mit HAVING auch nach berechneten Werten filtern, die nicht in der Feldliste vorkommen.

Häufig wollen wir die Daten auch auf Grund der berechneten Felder sortieren. Im Gegensatz zur HAVING und GROUP BY Klausel können wir uns aber hier auf die in der Feldliste definierten Spaltennamen beziehen. Also beispielsweise: ORDER BY sum_effort DESC . Die ORDER BY-Klausel kommt stets am Ende nach Gruppierung und HAVING-Klausel.