PIVOT- und Kreuztabellensyntax der Anbieter
SQL Server PIVOT und Postgres crosstab sowie deren Einschränkungen.
PIVOT- und Kreuztabellensyntax der Anbieter ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 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 Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Über die bedingte Aggregation hinaus
Sie kennen bereits den portablen CASE-Pivot. Interviewerinnen und Interviewer möchten aber auch wissen, ob Sie anbieterspezifische Pivot-Operatoren verwenden können, wenn diese verfügbar sind.
SQL Server bietet einen eigenen PIVOT-Operator. PostgreSQL stellt in der Erweiterung tablefunc die Funktion crosstab bereit. Wenn Sie beide Möglichkeiten und ihre Tücken kennen, zeigt das praktische Erfahrung.
Aufbau von SQL Server PIVOT
SQL Servers PIVOT benötigt drei Dinge:
- Ein Aggregat über der Wertespalte.
- Eine
FOR-Klausel, die die Spalte benennt, deren Werte zu neuen Spalten werden. - Eine
IN-Liste der Literalwerte, die in Spalten umgewandelt werden sollen.
Der Operator muss auf eine abgeleitete Tabelle angewendet werden, die genau den Schlüssel, die Spalte zum Aufspalten und den Wert enthält, und keine weiteren Spalten.
SELECT region, [Q1], [Q2]
FROM (SELECT region, quarter, amount FROM sales) AS src
PIVOT (
SUM(amount)
FOR quarter IN ([Q1], [Q2])
) AS p;Die implizite GROUP-BY-Klausel
Eine subtile PIVOT-Tücke, die in Vorstellungsgesprächen gern getestet wird: Die Gruppierung erfolgt implizit. SQL Server gruppiert nach jeder Spalte der Quelle, die weder die aggregierte Spalte noch die FOR-Spalte ist.
Wenn Ihre abgeleitete Tabelle also versehentlich eine zusätzliche Spalte wie order_id enthält, gruppiert der Pivot auch danach, und Sie erhalten deutlich mehr Zeilen als erwartet. Beschränken Sie die innere Abfrage immer auf Schlüssel, Aufspaltspalte und Wert.
-- WRONG: order_id leaks in and breaks grouping
FROM (SELECT region, quarter, amount, order_id FROM sales) AS src
PIVOT (SUM(amount) FOR quarter IN ([Q1],[Q2])) AS p;
-- The pivot now groups by region AND order_idSpaltennamen in eckigen Klammern
In SQL Server sind die Namen der pivotierten Spalten die Literalwerte aus den Daten, eingeschlossen in eckige Klammern. Wenn ein Wert mit einer Ziffer beginnt oder Leerzeichen enthält, sind die Klammern zwingend erforderlich.
Sie wählen diese Spalten in der äußeren SELECT-Abfrage mit demselben Namen in eckigen Klammern aus. Deshalb kann PIVOT auch keine unbekannten Werte ohne dynamisches SQL verarbeiten: Die IN-Liste ist fest im Code vorgegeben.
SELECT region, [2023], [2024]
FROM (SELECT region, yr, amount FROM sales) AS s
PIVOT (SUM(amount) FOR yr IN ([2023], [2024])) AS p;PostgreSQL crosstab
PostgreSQL hat kein Schlüsselwort PIVOT. Stattdessen stellt die Erweiterung tablefunc die Funktion crosstab bereit, die eine SQL-Zeichenkette entgegennimmt und deren Ergebnis umstrukturiert.
Sie müssen die Erweiterung zunächst aktivieren. crosstab erwartet, dass die Quellabfrage genau drei Spalten zurückgibt: Zeilenbezeichner, Kategorie und Wert, und zwar in dieser Reihenfolge.
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);Die Spaltendefinitionsliste
Der fehleranfälligste Teil von crosstab ist die nachgestellte Spaltendefinitionsliste AS ct(...). Sie müssen die Namen und Datentypen der Ausgabespalten selbst deklarieren. Diese müssen mit der Anzahl und Reihenfolge der Kategorien übereinstimmen.
Wenn eine Kategorie für eine Zeile fehlt, füllt crosstab die Spalten positionsbezogen. Dadurch können sich Daten verschieben, sofern Sie nicht die unten beschriebene Zwei-Argument-Form verwenden.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);
-- ct(...) MUST list every output column and its typecrosstab mit zwei Argumenten
Um eine falsche Zuordnung zu vermeiden, wenn einigen Zeilen bestimmte Kategorien fehlen, verwenden Sie die Zwei-Argument-Form. Die zweite Abfrage gibt die vollständige, geordnete Liste der Kategorienwerte zurück. Dadurch weiß crosstab genau, in welche Spalte jeder Wert gehört.
Diese robuste Form erwarten Interviewerinnen und Interviewer, wenn Kategorien nur für einige Zeilen vorhanden sind.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2',
'SELECT DISTINCT quarter FROM sales ORDER BY 1'
) AS ct(region text, q1 numeric, q2 numeric);MySQL bietet beides nicht
Wenn die interviewende Person nach MySQL fragt, lautet die direkte Antwort: MySQL hat weder PIVOT noch crosstab. Ihre einzige Möglichkeit ist dort die bedingte Aggregation mit CASE (oder die Kurzform SUM(... ) + IF()).
Genau deshalb ist das portable CASE-Muster so wertvoll: Es ist der kleinste gemeinsame Nenner, der überall funktioniert.
-- MySQL: only conditional aggregation works
SELECT
region,
SUM(IF(quarter = 'Q1', amount, 0)) AS q1,
SUM(IF(quarter = 'Q2', amount, 0)) AS q2
FROM sales
GROUP BY region;Ausgearbeitetes Beispiel: Statuszählungen in SQL Server
Eine typische Anforderung für einen Bericht lautet: "eine Zeile pro Region mit einer Spalte, die die Bestellungen je Status zählt". In SQL Server übergeben Sie eine gekürzte abgeleitete Tabelle an PIVOT und verwenden COUNT.
Da Sie die Statusspalte selbst zählen, wird jede Zeile mit einem Wert ungleich NULL in einem Bucket mitgezählt. Die äußere SELECT-Abfrage führt jeden Status als Spalte in eckigen Klammern auf. Das ist die kompakte Alternative zu drei Ausdrücken der Form COUNT(CASE ...).
SELECT region, [pending], [shipped], [delivered]
FROM (SELECT region, status FROM orders) AS src
PIVOT (
COUNT(status)
FOR status IN ([pending], [shipped], [delivered])
) AS p;Gemeinsame Einschränkungen
PIVOT und crosstab haben dieselbe grundlegende Einschränkung wie die bedingte Aggregation: Die Ausgabespalten müssen beim Schreiben der Abfrage bekannt sein.
- SQL Server: Die
IN-Liste enthält Literale. - Postgres crosstab: Die Spaltendefinitionsliste enthält Literale.
Keine der beiden Möglichkeiten kann Kategorien zur Laufzeit ermitteln. Dafür muss die SQL-Zeichenkette dynamisch erstellt werden.
Welche Möglichkeit sollten Sie verwenden?
Eine gute Antwort im Vorstellungsgespräch vergleicht die Möglichkeiten ehrlich:
- CASE-Aggregation: portabel, gut lesbar und mit jeder Engine kompatibel. Die Standardwahl.
- SQL Server PIVOT: bei vielen Spalten kompakt, aber die implizite Gruppierung sorgt häufig für Überraschungen.
- Postgres crosstab: leistungsfähig, aber ausführlich; benötigt eine Erweiterung und eine Spaltendefinitionsliste.
Wenn Sie unsicher sind, greifen Sie zur bedingten Aggregation und erwähnen Sie die anbieterspezifischen Operatoren als Alternativen.
Kurzer Test
Prüfen Sie, welches Verhalten von SQL Server PIVOT in Vorstellungsgesprächen besonders häufig hinterfragt wird.
Zusammenfassung
Die Pivot-Syntax der verschiedenen Anbieter auf einen Blick:
- SQL Server:
PIVOT (SUM(x) FOR col IN ([a],[b]))mit einem impliziten GROUP BY über die verbleibenden Spalten. - Postgres:
crosstab()austablefunc, benötigt eine Spaltendefinitionsliste; verwenden Sie bei Daten mit fehlenden Kategorien die Zwei-Argument-Form. - MySQL: Keine der beiden Möglichkeiten ist vorhanden, verwenden Sie
CASE. - Bei allen drei Möglichkeiten müssen die Spalten beim Schreiben der Abfrage bekannt sein.
Häufig gestellte Fragen
Ist die Lektion „PIVOT- und Kreuztabellensyntax der Anbieter“ kostenlos?
Ja — der vollständige Text von „PIVOT- und Kreuztabellensyntax der Anbieter“ 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 Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „PIVOT- und Kreuztabellensyntax der Anbieter“?
SQL Server PIVOT und Postgres crosstab sowie deren Einschränkungen. Du übst SQL Interview Prep 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 Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. SQL Interview Prep 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 2 von 4.
Wie lange dauert die Lektion „PIVOT- und Kreuztabellensyntax der Anbieter“?
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 Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede SQL Interview Prep-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
- Pivotieren mit bedingter Aggregation
- PIVOT- und Kreuztabellensyntax der Anbieter
- Spalten in Zeilen umwandeln
- Dynamische Pivots mit unbekannten Spalten