📊 1. Aggregatfunktionen in SQL
Aggregatfunktionen fassen mehrere Zeilen zu einem einzigen zusammenfassenden Wert zusammen. Die fünf wichtigsten Standard-Aggregate sind:
COUNT(*) / COUNT(spalte)
Zählt Zeilen bzw. Nicht-NULL-Werte.
SUM(spalte)
Berechnet die Gesamtsumme aller Werte.
AVG(spalte)
Berechnet das arithmetische Mittel (Durchschnitt).
MIN(spalte) / MAX(spalte)
Findet den kleinsten bzw. größten Wert.
-- Berechne KPI-Kennzahlen über die gesamte Tabelle
SELECT
COUNT(*) AS anzahl_bestellungen,
SUM(gesamtbetrag) AS gesamtumsatz,
ROUND(AVG(gesamtbetrag), 2) AS durchschnitts_warenkorb,
MIN(gesamtbetrag) AS kleinste_bestellung,
MAX(gesamtbetrag) AS groesste_bestellung
FROM bestellungen
WHERE status = 'abgeschlossen';
🗂️ 2. Gruppierung mit GROUP BY & Filterung mit HAVING
Mit GROUP BY teilen wir Datensätze in Kategorien oder Buckets ein.
Wichtig: Wenn nach einer Spalte gruppiert wird, dürfen im SELECT nur gruppierte Spalten oder Aggregatfunktionen stehen!
-- Umsatz und Bestellanzahl pro Kunde ermitteln
SELECT
k.name AS kunden_name,
COUNT(b.id) AS bestell_anzahl,
SUM(b.gesamtbetrag) AS umsatz_gesamt
FROM kunden k
JOIN bestellungen b ON k.id = b.kunde_id
WHERE b.status = 'abgeschlossen' -- 1. WHERE filtert Rohdaten VOR der Gruppierung
GROUP BY k.id, k.name -- 2. GROUP BY bildet Gruppen
HAVING SUM(b.gesamtbetrag) >= 500 -- 3. HAVING filtert AGGREGATE NACH der Gruppierung
ORDER BY umsatz_gesamt DESC; -- 4. ORDER BY sortiert das Endergebnis
🔍 WHERE-Klausel
Filtert einzelne Zeilen, bevor Aggregate gebildet werden. Kann keine Aggregatfunktionen wie SUM() oder COUNT() enthalten!
🎯 HAVING-Klausel
Filtert zusammengefasste Gruppen nach der Aggregation. Prüft Bedingungen wie HAVING COUNT(*) > 5 oder HAVING AVG(preis) < 100.
🏭 3. Didaktische Analogie: Die Rechnungsprüfungs-Zentrale
WHERE (Der Türsteher): Beschädigte Briefe (stornierte Bestellungen) werden sofort am Werkstor aussortiert.
GROUP BY (Die Sortierfächer): Alle verbleibenden Rechnungen werden in Fächer nach Postleitzahl / Kunde abgelegt.
Aggregat (Der Taschenrechner): Für jedes Fach wird die Summe und der Durchschnitt der Rechnungsbeträge ermittelt.
HAVING (Der Chef-Filter): Nur Fächer, deren Gesamtumsatz über 10.000 € liegt, werden zur Sonderprüfung weitergereicht.
📑 4. Cheat-Sheet: SQL-Aggregationsklauseln
| Syntax / Funktion | Zweck | Beispiel |
|---|---|---|
COUNT(DISTINCT spalte) |
Zählt eindeutige Werte (ohne Duplikate) | COUNT(DISTINCT kunde_id) |
SUM(spalte * menge) |
Summiert berechnete Zeilenwerte | SUM(anzahl * einzelpreis) |
ROUND(AVG(spalte), 2) |
Rundet den Durchschnitt auf 2 Nachkommastellen | ROUND(AVG(gehalt), 2) |
strftime('%Y-%m', datum) |
Datumsformatierung für Monats-Reporting in SQLite | GROUP BY strftime('%Y-%m', datum) |
🎯 5. Aufgaben & Checkliste in aufgabe.sql
Öffne die Datei aufgabe.sql und implementiere die 4 Reporting-Queries: