HAVING: Bedingung für Gruppen
Kurz gesagt: HAVING filtert Gruppen nach dem Gruppieren, WHERE filtert einzelne Zeilen davor, und eine Bedingung auf SUM oder COUNT gehört in HAVING.
Problem
Die Kundenkarte
Der Shop startet eine Kundenkarte: Kunden mit mehr als 3 Bestellungen bekommen eine. Du weißt, wie du die Bestellungen jedes Kunden mit GROUP BY customer_id zählst. Das ergibt 18 Zeilen. Wie behältst du nur die mit mehr als 3?
WHERE reicht nicht: Es sieht einzelne Bestellungen, und die Anzahl gehört zum ganzen Kunden.
Die Idee
HAVING
HAVING ist eine Bedingung für die Gruppen. Sie steht nach GROUP BY und darf ein Aggregat enthalten:
Vier Kunden. Die Gruppen werden gebildet, die Anzahl wird für jede berechnet, und HAVING behält nur die Gruppen, für die die Bedingung wahr ist.
Probier es aus
Die großen Bestellungen
Für die kostenlose Lieferung brauchen wir die Bestellungen über 30 €. Das Feld zeigt den Wert jeder Bestellung. Behalte nur die über 30 €.
Lösung
SELECT order_id, SUM(quantity * unit_price) AS total
FROM order_items
GROUP BY order_id
HAVING SUM(quantity * unit_price) > 30;HAVING SUM(quantity * unit_price) > 30. 25 der 60 Bestellungen. SQLite akzeptiert auch HAVING total > 30 mit dem Alias, aber nicht jede Datenbank tut das. Das ist das Thema der nächsten Lektion.
Sieh es dir an
SUM in WHERE
Fast jeder versucht es zuerst mit WHERE. Führe es aus:
SQLite bricht mit „misuse of aggregate“ ab: ein Aggregat an einer Stelle, wo es nicht hingehört. In WHERE geht die Datenbank die Zeilen einzeln durch. Es gibt noch keine Gruppen, also gibt es nichts zu addieren.
Die Idee
WHERE und HAVING zusammen
Die beiden kommen sich nicht in die Quere. Sie arbeiten an verschiedenen Stellen:
WHEREfiltert die Zeilen vor den Gruppen;HAVINGfiltert die Gruppen danach.
Die Kundenkarte ohne die stornierten Bestellungen:
Kunde 7 ist herausgefallen. Er hat 4 Bestellungen, aber eine ist storniert. WHERE hat sie entfernt, bevor die Gruppen gebildet wurden, und in seiner Gruppe blieben 3.
Eine Bedingung, die eine einzelne Zeile betrachtet (status, ein Datum, ein Preis), gehört in WHERE. Sie verkleinert die Zeilen, die die Datenbank gruppieren muss. In HAVING bleiben nur die Bedingungen auf Aggregate.
Probier es aus
Nur einmal
Das Marketing will den Kunden schreiben, die 2026 genau einmal bestellt haben. Zähle alle Bestellungen, auch stornierte. Zeige customer_id und die Anzahl ihrer Bestellungen aus 2026.
Lösung
SELECT customer_id, COUNT(*)
FROM orders
WHERE ordered_at >= '2026-01-01'
GROUP BY customer_id
HAVING COUNT(*) = 1;WHERE ordered_at >= '2026-01-01', dann GROUP BY customer_id und HAVING COUNT(*) = 1. Sechs Kunden. Wer 2026 nichts bestellt hat, taucht nicht auf: Er hat keine Zeilen, also auch keine Gruppe. Für sie brauchst du einen JOIN.
Übung
Zwei Berichte
1. Lieferanten geben einen Rabatt auf Produkte, von denen wir viel verkaufen. Welche Produkte haben sich mindestens 15-mal verkauft?
Zeige product_id und die verkauften Stück für die Produkte mit mindestens 15 verkauften Stück.
Lösung
SELECT product_id, SUM(quantity)
FROM order_items
GROUP BY product_id
HAVING SUM(quantity) >= 15;GROUP BY product_id HAVING SUM(quantity) >= 15. Zehn Produkte. „Mindestens 15“ schließt 15 ein, also >=.
2. In welchen Monaten gab es mindestens 6 Bestellungen? Diese Monate brauchen mehr Leute im Lager.
Zeige den Monat (Jahr-Monat) und die Anzahl der Bestellungen für die Monate mit mindestens 6 Bestellungen.
Lösung
SELECT strftime('%Y-%m', ordered_at) AS month, COUNT(*)
FROM orders
GROUP BY strftime('%Y-%m', ordered_at)
HAVING COUNT(*) >= 6;GROUP BY strftime('%Y-%m', ordered_at) HAVING COUNT(*) >= 6. Vier Monate: September und Oktober 2025, Mai und September 2026. Der geschäftigste ist der Oktober 2025 mit 9 Bestellungen.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Rechnen in einer Abfrage · Datumsfunktionen · Aggregatfunktionen: COUNT, SUM, AVG · GROUP BY: ein Bericht nach Gruppen
- Geht weiter in: Die Reihenfolge der Ausführung einer Abfrage · Beziehungstypen: 1:1, 1:N, M:N · Natürliche Schlüssel und Denormalisierung · Dokumentendatenbanken
- Aufgaben zum Thema: Zusammenfassen