Zum Inhalt
wannacode

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:

SQLDatenbank: Shop

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 €.

SQLDatenbank: Shop

Sieh es dir an

SUM in WHERE

Fast jeder versucht es zuerst mit WHERE. Führe es aus:

SQLDatenbank: Shop

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:

  • WHERE filtert die Zeilen vor den Gruppen;
  • HAVING filtert die Gruppen danach.

Die Kundenkarte ohne die stornierten Bestellungen:

SQLDatenbank: Shop

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.

SQLDatenbank: Shop

Ü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.

SQLDatenbank: Shop

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.

SQLDatenbank: Shop

Test

Teste dich

1. Welche Bedingung findet die Bestellungen über 30 €?
2. Wann wird WHERE angewendet?
3. Kunde 7 hat 4 Bestellungen, eine davon storniert. Kommt er mit WHERE status <> 'cancelled' … HAVING COUNT(*) > 3 heraus?
4. Was bedeutet der Fehler „misuse of aggregate function SUM()“?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·