⚡ Lehrpfad 3: Aggregationen, CTEs & Window Functions

SQL 11: Common Table Expressions (WITH CTE)

Schreibe modulare, lesbare und wartbare SQL-Pipelines mit WITH cte AS (...), verkette mehrstufige Transformationen und meistere rekursive CTEs für Baumstrukturen und Hierarchien.

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

🧱 1. Was sind Common Table Expressions (CTEs)?

Eine CTE (Common Table Expression) definiert ein temporäres, benanntes Zwischenergebnis mit dem Schlüsselwort WITH. Sie ersetzt unübersichtlich tief verschachtelte Subqueries durch eine saubere, lineare Schritt-für-Schritt-Pipeline:

-- Modulare Umsatzberechnung mit WITH CTE
WITH kunden_umsatz AS (
    SELECT 
        kunde_id,
        COUNT(id) AS anzahl_orders,
        SUM(gesamtbetrag) AS umsatz_summe
    FROM bestellungen
    WHERE status = 'abgeschlossen'
    GROUP BY kunde_id
)
SELECT 
    k.name,
    ku.anzahl_orders,
    ku.umsatz_summe
FROM kunden k
JOIN kunden_umsatz ku ON k.id = ku.kunde_id
WHERE ku.umsatz_summe > 1000
ORDER BY ku.umsatz_summe DESC;

⛓️ 2. Gekettete (Chained) & Rekursive CTEs

Du kannst mehrere CTEs mit Kommas aneinanderhängen (Pipelines), wobei spätere CTEs auf frühere zugreifen dürfen:

WITH 
monats_daten AS (
    SELECT strftime('%Y-%m', datum) AS monat, SUM(betrag) AS umsatz FROM sales GROUP BY monat
),
benchmark AS (
    SELECT AVG(umsatz) AS avg_umsatz FROM monats_daten
)
SELECT m.monat, m.umsatz, b.avg_umsatz, (m.umsatz - b.avg_umsatz) AS diff
FROM monats_daten m, benchmark b;

🌳 Rekursive CTEs (Hierarchien & Graphen)

Rekursive CTEs bestehen aus einem Anker-Select, einem UNION ALL und einem Rekursions-Schritt:

WITH RECURSIVE organigramm AS (
    -- 1. ANKER-MEMBER (Root / CEO: vorgesetzter_id IS NULL)
    SELECT id, name, vorgesetzter_id, 1 AS ebene, name AS pfad
    FROM mitarbeiter WHERE vorgesetzter_id IS NULL
    
    UNION ALL
    
    -- 2. REKURSIONS-MEMBER (Kind-Knoten rekursiv joinen)
    SELECT m.id, m.name, m.vorgesetzter_id, o.ebene + 1, o.pfad || ' -> ' || m.name
    FROM mitarbeiter m
    JOIN organigramm o ON m.vorgesetzter_id = o.id
)
SELECT * FROM organigramm ORDER BY ebene, name;

🏭 3. Didaktische Analogie: Das modulare Fließband

🚗 Der Montage-Vergleich

Subquery (Spaghetti-Schachtelung): Du versuchst, Motor, Getriebe, Lackierung und Räder in einer einzigen unübersichtlichen 50-Zeilen-Klammer zusammenzustecken.

CTEs (Modulare Montagestationen): Station 1 (WITH motor AS ...) baut den Motor. Station 2 (karosserie AS ...) nutzt Station 1. Haupt-SELECT montiert das fertige Fahrzeug.

📑 4. Cheat-Sheet: CTE-Syntax & Muster

Pattern Syntax Einsatzgebiet
Einfache CTE WITH name AS (SELECT ...) SELECT ... Lesbarkeit, DRY-Prinzip, Vorberechnung
Gekettete CTEs WITH a AS (...), b AS (SELECT FROM a) SELECT ... Mehrstufige Data Pipelines & Benchmarks
Datumsgenerator (Rekursiv) WITH RECURSIVE t(d) AS (SELECT '2024-01-01' UNION ALL SELECT date(d, '+1 day') FROM t WHERE d < '2024-01-10') Lückenlose Kalendertabellen ohne Lücken im Reporting
Organigramm / Baum WITH RECURSIVE tree AS (Anchor UNION ALL Recursive JOIN tree) Kategoriebäume, Stücklisten, Manager-Stammbäume

🧠 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 Aufgaben:

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