Crosstab-Muster (PostgreSQL crosstab())
Erzeugen Sie echte Pivot-Tabellen mit der Funktion crosstab() der Erweiterung tablefunc.
Crosstab-Muster (PostgreSQL crosstab()) ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum ein echter Crosstab?
Bei CASE-Pivots müssen Sie jede Zielspalte auflisten. Für wirklich breite Pivots (z. B. eine Spalte pro Produkt) ist die crosstab()-Funktion der tablefunc-Erweiterung das passende Werkzeug.
Die Erweiterung aktivieren
tablefunc wird mit PostgreSQL contrib ausgeliefert:
CREATE EXTENSION IF NOT EXISTS tablefunc;Grundlegende crosstab-Signatur
crosstab übernimmt einen 3-spaltigen SQL-String (row_key, category, value) und liefert row_key plus eine Spalte pro category:
SELECT * FROM crosstab(
$$
SELECT user_id, status, COUNT(*)::INT
FROM orders
GROUP BY user_id, status
ORDER BY user_id, status
$$
) AS ct (
user_id BIGINT,
paid INT,
pending INT,
cancelled INT
);Warum Sie die Ausgabespalten deklarieren
SQL ist statisch typisiert – der Planer benötigt die Ausgabespalten bereits beim Parsen. Daher geben Sie das Schema in der AS-Klausel einschließlich der Datentypen an.
crosstab mit zwei Argumenten (mit Kategoriemenge)
Bei dünn besetzten Daten übergeben Sie die Kategorienliste separat, damit fehlende Werte zu NULL werden, statt eine falsche Zuordnung zu verursachen:
SELECT * FROM crosstab(
$$
SELECT user_id, status, COUNT(*)::INT
FROM orders GROUP BY user_id, status
ORDER BY user_id
$$,
$$ VALUES ('paid'), ('pending'), ('cancelled') $$
) AS ct (
user_id BIGINT, paid INT, pending INT, cancelled INT
);Wann CASE crosstab überlegen ist
Bei einer bekannten, kleinen Kategorienmenge ist CASE/FILTER einfacher – keine Erweiterung, keine Fallstricke der Zwei-Argument-Variante. Verwenden Sie crosstab, wenn:
- Sie viele Kategorien haben
- Kategorien dynamisch geladen werden
- Sie Daten für einen externen Pivot-Verbraucher erzeugen
Dynamische Pivots
Bei Kategorien, die zur Laufzeit unbekannt sind, generieren Sie das SQL in Ihrer Anwendung oder verwenden Sie PL/pgSQL mit format() + EXECUTE.
-- Build the SQL dynamically:
SELECT string_agg(format('SUM(CASE WHEN status = %L THEN 1 END) AS %I',
status, status), ', ')
FROM (SELECT DISTINCT status FROM orders) s;Breite Pivots für Tabellenkalkulationen
Berichte für Analysten benötigen häufig das Wide-Format. Erzeugen Sie es in SQL oder übergeben Sie einfach das Long-Format und lassen Sie das BI-Tool pivotieren.
Unpivot: Die Umkehrung
Für den Wechsel von Wide → Long verwenden Sie UNION ALL oder PostgreSQLs jsonb_each_text():
SELECT id, key AS month, (value)::NUMERIC AS revenue
FROM monthly_wide,
jsonb_each_text(to_jsonb(monthly_wide) - 'id');Performance
crosstab() führt das innere SQL einmal aus und pivotiert die Daten im Speicher. Der Engpass ist derselbe wie bei einer normalen GROUP-BY-Abfrage.
Einschränkungen von Crosstab
PostgreSQL besitzt kein natives PIVOT-Schlüsselwort (anders als Oracle/SQL Server). crosstab() ist die Lösung dafür.
Zusammenfassung
Für die meisten Pivots ist CASE/FILTER die saubere Lösung. crosstab() ist das passende Werkzeug, wenn es viele Kategorien gibt oder diese im Voraus unbekannt sind.
Kurztest
Welche Erweiterung stellt PostgreSQLs Funktion crosstab() bereit?
Häufig gestellte Fragen
Ist die Lektion „Crosstab-Muster (PostgreSQL crosstab())“ kostenlos?
Ja — der vollständige Text von „Crosstab-Muster (PostgreSQL crosstab())“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Crosstab-Muster (PostgreSQL crosstab())“?
Erzeugen Sie echte Pivot-Tabellen mit der Funktion crosstab() der Erweiterung tablefunc. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Crosstab-Muster (PostgreSQL crosstab())“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- UNION, INTERSECT, EXCEPT
- UNION ALL vs. UNION (Kosten der Duplikatentfernung)
- CASE-Ausdrücke und Pivot-Abfragen
- Crosstab-Muster (PostgreSQL crosstab())