Spalten in Zeilen umwandeln
Breite Tabellen mit UNPIVOT oder UNION ALL zurückführen.
Spalten in Zeilen umwandeln ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Das umgekehrte Problem
Unpivoting ist das Gegenstück zum Pivotieren: Sie nehmen eine breite Tabelle und wandeln ihre Spalten zurück in Zeilen um. Interviewerinnen und Interviewer fragen danach, wenn Daten im Tabellenkalkulationsformat vorliegen, für die Analyse aber normalisiert werden müssen.
Beispiel: Eine Tabelle mit den Spalten q1, q2, q3, q4 pro Region muss in Zeilen der Form (region, quarter, amount) umgewandelt werden. Diese lange Form eignet sich besser für Aggregationen, Joins und Diagramme.
-- Wide input we want to unpivot
region | q1 | q2 | q3 | q4
-------+-----+-----+-----+----
East | 100 | 150 | 120 | 180
West | 200 | 250 | 210 | 260Das portable UNION-ALL-Muster
Die dialektunabhängige Antwort lautet UNION ALL: Schreiben Sie eine SELECT-Abfrage pro Quellspalte, die jeweils ein festes Label und den Wert dieser Spalte ausgibt.
Verwenden Sie UNION ALL und nicht UNION, damit keine Kosten für die Duplikatentfernung entstehen und jede Zeile erhalten bleibt, auch wenn zwei Zellen denselben Wert enthalten.
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL
SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL
SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL
SELECT region, 'Q4', q4 FROM wide_sales;Warum UNION ALL statt UNION
Das ist eine klassische Falle im Vorstellungsgespräch. UNION entfernt doppelte Zeilen im gesamten Ergebnis. Wenn East und West für Q1 beide 100 enthielten, würde ein einfaches UNION identische Zeilen zusammenfassen, und Sie würden Daten verlieren.
UNION ALL hängt die Ergebnisse ohne Duplikatentfernung aneinander, genau wie es beim Unpivoting erforderlich ist. Außerdem ist es schneller, weil weder eine Sortierung noch ein Hashing zur Duplikatentfernung erforderlich ist.
-- UNION would wrongly merge identical (region, quarter, amount) rows
-- UNION ALL keeps every row, always the correct choice hereAusrichtung der Spaltentypen
Jeder Zweig von UNION ALL muss dieselbe Anzahl von Spalten mit kompatiblen Datentypen in derselben Reihenfolge liefern. Die Spaltennamen stammen aus der ersten SELECT-Abfrage.
Wenn sich die Typen Ihrer breiten Spalten unterscheiden (beispielsweise int und decimal), wählt die Engine einen gemeinsamen Typ. Sind die Typen tatsächlich inkompatibel, wandeln Sie sie explizit um, damit die Union nicht fehlschlägt.
SELECT region, 'revenue' AS metric, CAST(revenue AS decimal(12,2)) AS val FROM t
UNION ALL
SELECT region, 'units', CAST(units AS decimal(12,2)) FROM t;SQL Server UNPIVOT
SQL Server verfügt über einen eigenen UNPIVOT-Operator, der kompakter ist als UNION ALL. Sie benennen die neue Wertespalte und die neue Labelspalte und listen die Quellspalten auf, die zusammengeführt werden sollen.
Ein wichtiges Verhalten: UNPIVOT entfernt Zeilen, deren Wert NULL ist. In Vorstellungsgesprächen wird getestet, ob Sie diesen Nebeneffekt kennen.
SELECT region, quarter, amount
FROM wide_sales
UNPIVOT (
amount FOR quarter IN (q1, q2, q3, q4)
) AS u;UNPIVOT entfernt NULL-Werte
Wenn eine Region in q3 den Wert NULL enthält, lässt SQL Servers UNPIVOT diese Zeile im Ergebnis einfach weg. Wenn Sie unabhängig von NULL-Werten eine Zeile für jede Spalte benötigen, verwenden Sie stattdessen UNION ALL, das diese Zeilen erhält.
Benennen Sie diesen Unterschied im Vorstellungsgespräch: Der native UNPIVOT-Operator ist kompakt, verliert aber NULL-Werte; UNION ALL ist ausführlicher, aber vollständig.
-- UNPIVOT: q3 NULL for East -> no (East, Q3) row produced
-- UNION ALL: (East, 'Q3', NULL) row IS producedPostgreSQL: LATERAL VALUES
PostgreSQL hat kein UNPIVOT. Ein übersichtliches Idiom ist jedoch ein CROSS JOIN LATERAL über eine VALUES-Liste. Jede breite Zeile wird mit einer kleinen Inline-Tabelle aus (Label, Wert)-Paaren erweitert.
Das ist übersichtlicher als ein langes UNION ALL und liest die Quelltabelle nur einmal.
SELECT w.region, v.quarter, v.amount
FROM wide_sales w
CROSS JOIN LATERAL (VALUES
('Q1', w.q1),
('Q2', w.q2),
('Q3', w.q3),
('Q4', w.q4)
) AS v(quarter, amount);Die Tabelle nur einmal lesen
Ein erwähnenswerter Performance-Aspekt: Das naive UNION ALL liest die breite Tabelle einmal pro Zweig ein (bei vier Quartalen also viermal). Die Form mit LATERAL VALUES und SQL Server UNPIVOT lesen die Quelle dagegen nur einmal.
Bei großen Tabellen ist das wichtig. Wenn Sie UNION ALL verwenden müssen, kann der Optimizer die Tabelle trotzdem mehrfach lesen. Erwähnen Sie daher LATERAL oder UNPIVOT als effizientere Möglichkeit.
Leere Zellen herausfiltern
Mit UNION ALL oder LATERAL behalten Sie Zeilen mit NULL-Werten. Wenn die Fragestellung nur befüllte Zellen verlangt, fügen Sie einen Filter hinzu. Damit ahmen Sie das Verhalten von SQL Server UNPIVOT nach, das solche Zeilen automatisch entfernt.
Ob NULL-Werte erhalten oder entfernt werden sollen, hängt von der konkreten Anforderung ab. Klären Sie dies daher vor dem Programmieren mit der interviewenden Person.
SELECT region, quarter, amount
FROM (
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
) t
WHERE amount IS NOT NULL;Ausgearbeitetes Beispiel: Aggregation nach dem Unpivotieren
Eine häufige Folgefrage lautet: „Geben Sie aus der vierteljährlichen Tabelle im Breitformat den Gesamtumsatz pro Region über alle Quartale hinweg aus.“ Nach dem Unpivotieren ins Langformat ist die Aggregation trivial: eine einzige nach Region gruppierte SUM-Aggregation.
Das zeigt den eigentlichen Grund, warum Sie zuerst unpivotieren sollten. Vier separate Spalten zu summieren ist fehleranfällig, aber ein SUM(amount) GROUP BY region im Langformat lässt sich auf beliebig viele Quartale erweitern.
WITH long_sales AS (
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL SELECT region, 'Q4', q4 FROM wide_sales
)
SELECT region, SUM(amount) AS total
FROM long_sales
GROUP BY region;Wann Sie unpivotieren sollten
Erkennen Sie in einer Aufgabenstellung das Signal zum Unpivotieren:
- Die Eingabe enthält wiederholte Spalten, die eigentlich Werte darstellen (Monate, Jahre, Kennzahlen).
- Sie müssen über diese Werte hinweg aggregieren, Joins durchführen oder Diagramme erstellen.
- Sie möchten beim Import denormalisierte Tabellendaten aus einer Tabellenkalkulation normalisieren.
Das Langformat ist für die weitere Arbeit mit SQL fast immer die richtige Struktur. Daher ist das Unpivotieren häufig ein erster Schritt.
Kurzer Check
Bestätigen Sie, dass Sie die häufigste Falle beim Unpivotieren kennen.
Zusammenfassung
Beim Unpivotieren werden Spalten in Zeilen umgewandelt:
- Portabel: eine
SELECT-Abfrage pro Spalte, mitUNION ALLverbunden (niemals ein einfaches UNION). - SQL Server: natives
UNPIVOT, kompakt, entfernt jedoch NULL-Werte. - Postgres:
CROSS JOIN LATERAL (VALUES ...), ein einziger Scan. - Richten Sie die Anzahl und die Datentypen der Spalten in allen Abfragezweigen aufeinander aus. Filtern Sie NULL-Werte, wenn die Aufgabenstellung dies verlangt.
Häufig gestellte Fragen
Ist die Lektion „Spalten in Zeilen umwandeln“ kostenlos?
Ja — der vollständige Text von „Spalten in Zeilen umwandeln“ 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 „Spalten in Zeilen umwandeln“?
Breite Tabellen mit UNPIVOT oder UNION ALL zurückführen. 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 3 von 4.
Wie lange dauert die Lektion „Spalten in Zeilen umwandeln“?
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