⚡ Lehrpfad 3: Aggregationen, CTEs & Window Functions

SQL 09: Aggregationen & GROUP BY

Lerne Kennzahlen und Berichte aus relationalen Daten zu berechnen: Aggregatfunktionen (COUNT, SUM, AVG, MIN, MAX), Gruppierungen mit GROUP BY und Gruppenfilterung mit HAVING.

📂 Dateien dieser Lerneinheit:
📄 aufgabe.sql (Startercode) 🧪 test_aufgabe.sql (Testsuite) 💡 musterloesung.sql (Lösung) 📖 README.md

📊 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

📦 Der Post-Sortier-Vergleich

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)

🧠 Diagnostischer Selbst-Check

Überprüfe dein Verständnis der Kernkonzepte und typischen Denkfallen, bevor du den Code in der Web-IDE schreibst.

🎯 5. Aufgaben & Checkliste in aufgabe.sql

Öffne die Datei aufgabe.sql und implementiere die 4 Reporting-Queries:

💻 In Web-IDE öffnen & lösen →