GROUP BY bildet aus den ausgewählten Zeilen Gruppen mit gleichen Merkmalswerten. Aggregate werden dann je Gruppe berechnet. Jede ausgegebene, nicht aggregierte Spalte wird hier ausdrücklich gruppiert. WHERE filtert vorher einzelne Datensätze, HAVING danach die Gruppenergebnisse. Die gedankliche Reihenfolge lautet FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. SQLite lässt manche ungruppierten Spalten zu; deren willkürlich ausgewählte Werte sind aber keine saubere, übertragbare Lösung.
GROUP BY
Gruppierungsmerkmal
HAVING
Aggregat
WHERE
Beispiel
SELECT region, SUM(betrag) AS umsatz
FROM bestellung
WHERE status = 'bezahlt'
GROUP BY region
HAVING SUM(betrag) >= 100
ORDER BY region;
Typische Fehler
Aggregatbedingungen in WHERE schreiben
Unterschiedliche Status in eine unerwünschte Gesamtsumme aufnehmen
Nicht aggregierte Ausgabespalten bei GROUP BY vergessen
Kurz zusammengefasst
WHERE entscheidet, welche Zeilen mitrechnen; GROUP BY bestimmt die Gruppen; HAVING entscheidet, welche berechneten Gruppen im Ergebnis bleiben.
Abi-Bezug
Übersetze mehrteilige Berichtsanfragen in Zeilenfilter, Gruppierungsmerkmale und Gruppenfilter. Begründe die Position jeder Bedingung.
Jetzt selbst ausprobieren
Prüfe deine Lösung automatisch. Bei Bedarf helfen dir ein Tipp und anschließend die Musterlösung.
BPE 6J11 Punkteleicht
Bestellungen je Region zählen
Noch nicht begonnen
Aufgabenstellung
Gib für jede vorhandene Region ihre Bezeichnung und die Zahl der Bestellungen als anzahl aus.
Ergebnisspalten in dieser Reihenfolge: region, anzahl. Die Zeilenreihenfolge ist hier beliebig. Gib genau diese eine Ergebnistabelle aus.
Datenbankschema und vollständige Startdaten anzeigen
Fiktive Übungsdaten. Jeder Test startet neu mit genau diesen Daten. NULL bedeutet: kein Wert gespeichert. Preise und Beträge sind ganze Euro; das Datum hat das Format JJJJ-MM-TT.
CREATE TABLE bestellung (id INTEGER PRIMARY KEY, region TEXT NOT NULL, status TEXT NOT NULL, betrag INTEGER NOT NULL, datum TEXT NOT NULL);
Startdaten: bestellung
id
region
status
betrag
datum
1
Nord
bezahlt
40
2026-03-01
2
Nord
offen
20
2026-03-10
3
Sued
bezahlt
30
2026-03-12
4
Sued
bezahlt
70
2026-04-01
5
West
storniert
50
2026-03-20
6
West
bezahlt
10
2025-03-15
7
Nord
bezahlt
60
2026-04-15
8
Ost
offen
20
2026-03-31
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
GROUP BY region erzeugt eine Gruppe je Region.
COUNT(*) wird anschließend für jede Gruppe getrennt ausgewertet.
Lösung anzeigen
SELECT region, COUNT(*) AS anzahl FROM bestellung GROUP BY region;
BPE 6J11 Punkteleicht
Bestellwert pro Region
Noch nicht begonnen
Aufgabenstellung
Berechne die Summe aller Bestellbeträge je Region als bestellwert. Alle Status zählen mit. Sortiere die Ausgabe aufsteigend nach Region.
Ergebnisspalten in dieser Reihenfolge: region, bestellwert. Die angegebene Zeilensortierung wird geprüft. Gib genau diese eine Ergebnistabelle aus.
Datenbankschema und vollständige Startdaten anzeigen
Fiktive Übungsdaten. Jeder Test startet neu mit genau diesen Daten. NULL bedeutet: kein Wert gespeichert. Preise und Beträge sind ganze Euro; das Datum hat das Format JJJJ-MM-TT.
CREATE TABLE bestellung (id INTEGER PRIMARY KEY, region TEXT NOT NULL, status TEXT NOT NULL, betrag INTEGER NOT NULL, datum TEXT NOT NULL);
Startdaten: bestellung
id
region
status
betrag
datum
1
Nord
bezahlt
40
2026-03-01
2
Nord
offen
20
2026-03-10
3
Sued
bezahlt
30
2026-03-12
4
Sued
bezahlt
70
2026-04-01
5
West
storniert
50
2026-03-20
6
West
bezahlt
10
2025-03-15
7
Nord
bezahlt
60
2026-04-15
8
Ost
offen
20
2026-03-31
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Die Einzelbeträge werden je Region mit SUM zusammengefasst.
Es ist kein Statusfilter verlangt; auch offen und storniert zählen mit.
Lösung anzeigen
SELECT region, SUM(betrag) AS bestellwert FROM bestellung GROUP BY region ORDER BY region ASC;
BPE 6J12 Punktemittel
Nur bezahlte Bestellungen auswerten
Noch nicht begonnen
Aufgabenstellung
Berechne je Region den Umsatz aus ausschließlich bezahlten Bestellungen als umsatz. Regionen ohne bezahlte Bestellung müssen hier nicht erscheinen.
Ergebnisspalten in dieser Reihenfolge: region, umsatz. Die Zeilenreihenfolge ist hier beliebig. Gib genau diese eine Ergebnistabelle aus.
Datenbankschema und vollständige Startdaten anzeigen
Fiktive Übungsdaten. Jeder Test startet neu mit genau diesen Daten. NULL bedeutet: kein Wert gespeichert. Preise und Beträge sind ganze Euro; das Datum hat das Format JJJJ-MM-TT.
CREATE TABLE bestellung (id INTEGER PRIMARY KEY, region TEXT NOT NULL, status TEXT NOT NULL, betrag INTEGER NOT NULL, datum TEXT NOT NULL);
Startdaten: bestellung
id
region
status
betrag
datum
1
Nord
bezahlt
40
2026-03-01
2
Nord
offen
20
2026-03-10
3
Sued
bezahlt
30
2026-03-12
4
Sued
bezahlt
70
2026-04-01
5
West
storniert
50
2026-03-20
6
West
bezahlt
10
2025-03-15
7
Nord
bezahlt
60
2026-04-15
8
Ost
offen
20
2026-03-31
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Einzelne unbezahlte Zeilen müssen vor der Summierung entfernt werden.
WHERE status = 'bezahlt' steht vor GROUP BY.
Lösung anzeigen
SELECT region, SUM(betrag) AS umsatz FROM bestellung WHERE status = 'bezahlt' GROUP BY region;
BPE 6J12 Punktemittel
Regionen mit mindestens zwei Bestellungen
Noch nicht begonnen
Aufgabenstellung
Gib nur Regionen mit mindestens zwei Bestellungen aus. Zeige Region und Anzahl als anzahl; alle Status zählen.
Ergebnisspalten in dieser Reihenfolge: region, anzahl. Die Zeilenreihenfolge ist hier beliebig. Gib genau diese eine Ergebnistabelle aus.
Datenbankschema und vollständige Startdaten anzeigen
Fiktive Übungsdaten. Jeder Test startet neu mit genau diesen Daten. NULL bedeutet: kein Wert gespeichert. Preise und Beträge sind ganze Euro; das Datum hat das Format JJJJ-MM-TT.
CREATE TABLE bestellung (id INTEGER PRIMARY KEY, region TEXT NOT NULL, status TEXT NOT NULL, betrag INTEGER NOT NULL, datum TEXT NOT NULL);
Startdaten: bestellung
id
region
status
betrag
datum
1
Nord
bezahlt
40
2026-03-01
2
Nord
offen
20
2026-03-10
3
Sued
bezahlt
30
2026-03-12
4
Sued
bezahlt
70
2026-04-01
5
West
storniert
50
2026-03-20
6
West
bezahlt
10
2025-03-15
7
Nord
bezahlt
60
2026-04-15
8
Ost
offen
20
2026-03-31
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Die Anzahl ist erst nach der Gruppierung bekannt.
Eine Bedingung über COUNT(*) gehört in HAVING; mindestens zwei schließt zwei ein.
Lösung anzeigen
SELECT region, COUNT(*) AS anzahl FROM bestellung GROUP BY region HAVING COUNT(*) >= 2;
BPE 6J13 Punkteanspruchsvoll
Region und Status gemeinsam gruppieren
Noch nicht begonnen
Aufgabenstellung
Berechne für jede vorkommende Kombination aus Region und Status die Zahl der Bestellungen als anzahl. Zeige beide Gruppierungsmerkmale. Leere Kombinationen werden nicht ergänzt.
Ergebnisspalten in dieser Reihenfolge: region, status, anzahl. Die Zeilenreihenfolge ist hier beliebig. Gib genau diese eine Ergebnistabelle aus.
Datenbankschema und vollständige Startdaten anzeigen
Fiktive Übungsdaten. Jeder Test startet neu mit genau diesen Daten. NULL bedeutet: kein Wert gespeichert. Preise und Beträge sind ganze Euro; das Datum hat das Format JJJJ-MM-TT.
CREATE TABLE bestellung (id INTEGER PRIMARY KEY, region TEXT NOT NULL, status TEXT NOT NULL, betrag INTEGER NOT NULL, datum TEXT NOT NULL);
Startdaten: bestellung
id
region
status
betrag
datum
1
Nord
bezahlt
40
2026-03-01
2
Nord
offen
20
2026-03-10
3
Sued
bezahlt
30
2026-03-12
4
Sued
bezahlt
70
2026-04-01
5
West
storniert
50
2026-03-20
6
West
bezahlt
10
2025-03-15
7
Nord
bezahlt
60
2026-04-15
8
Ost
offen
20
2026-03-31
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Ein Gruppenmerkmal reicht nicht, weil etwa Nord zwei Status besitzt.
Führe region und status gemeinsam in GROUP BY auf.
Lösung anzeigen
SELECT region, status, COUNT(*) AS anzahl FROM bestellung GROUP BY region, status;
BPE 6J13 Punkteanspruchsvoll
Umsatzgrenze nach Vorauswahl
Noch nicht begonnen
Aufgabenstellung
Berücksichtige nur bezahlte Bestellungen. Gib Region und Umsatz als umsatz nur für Regionen aus, deren bezahlter Umsatz mindestens 100 Euro erreicht. Sortiere nach Region aufsteigend.
Ergebnisspalten in dieser Reihenfolge: region, umsatz. Die angegebene Zeilensortierung wird geprüft. Gib genau diese eine Ergebnistabelle aus.
Datenbankschema und vollständige Startdaten anzeigen
Fiktive Übungsdaten. Jeder Test startet neu mit genau diesen Daten. NULL bedeutet: kein Wert gespeichert. Preise und Beträge sind ganze Euro; das Datum hat das Format JJJJ-MM-TT.
CREATE TABLE bestellung (id INTEGER PRIMARY KEY, region TEXT NOT NULL, status TEXT NOT NULL, betrag INTEGER NOT NULL, datum TEXT NOT NULL);
Startdaten: bestellung
id
region
status
betrag
datum
1
Nord
bezahlt
40
2026-03-01
2
Nord
offen
20
2026-03-10
3
Sued
bezahlt
30
2026-03-12
4
Sued
bezahlt
70
2026-04-01
5
West
storniert
50
2026-03-20
6
West
bezahlt
10
2025-03-15
7
Nord
bezahlt
60
2026-04-15
8
Ost
offen
20
2026-03-31
Ausgabe bzw. Vorschau
Noch nicht ausgeführt.
2 Tipps anzeigen
Der Statusfilter gehört in WHERE, die Umsatzgrenze in HAVING.
Die Summe 100 erfüllt die Formulierung mindestens 100 genau.
Lösung anzeigen
SELECT region, SUM(betrag) AS umsatz FROM bestellung WHERE status = 'bezahlt' GROUP BY region HAVING SUM(betrag) >= 100 ORDER BY region ASC;