0Pricing
SQL Interview Prep · Lektion

Pivotieren mit bedingter Aggregation

Das portierbare Muster CASE innerhalb von SUM, um Zeilen in Spalten umzuwandeln.

Pivotieren mit bedingter Aggregation ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 1 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.

Die Ausgangssituation im Vorstellungsgespräch

Eine der häufigsten Aufgaben in Vorstellungsgesprächen zur Berichterstellung lautet: Zeilen in Spalten umwandeln. Sie haben eine lange Tabelle wie sales(region, quarter, amount), und der Interviewer möchte einen breiten Bericht mit einer Spalte pro Quartal.

Die portable, SQL-Dialekt-unabhängige Antwort, die Sie nennen sollten, lautet bedingte Aggregation: ein CASE-Ausdruck innerhalb einer Aggregatfunktion wie SUM. Wenn Sie dieses Muster beherrschen, können Sie in jeder Datenbank pivotieren, auch in Datenbanken ohne das Schlüsselwort PIVOT.

Lang- und Breitformat

Benennen Sie vor dem Pivotieren zunächst die beiden Formen. Das Langformat speichert eine Tatsache pro Zeile: Jedes Regions-/Quartalspaar steht in einer eigenen Zeile. Das Breitformat verteilt eine Kategorie über mehrere Spalten.

  • Langformat: leicht einzufügen, schwer nebeneinander zu lesen.
  • Breitformat: ideal für einen menschenlesbaren Bericht.

Ein Pivotieren wandelt das Langformat in das Breitformat um. Interviewer schätzen dieses Thema, weil es prüft, ob Sie Aggregation und nicht nur Syntax verstehen.

-- Long form (the input)
region | quarter | amount
-------+---------+-------
East   | Q1      | 100
East   | Q2      | 150
West   | Q1      | 200
West   | Q2      | 250

Das Grundmuster

Der entscheidende Trick: Schreiben Sie für jede Ausgabespalte ein CASE, das den Wert zurückgibt, wenn die Zeile zu dieser Spalte passt, und andernfalls NULL. Schließen Sie den Ausdruck in eine Aggregatfunktion ein, damit die Gruppe auf eine Zeile pro Schlüssel reduziert wird.

Lesen Sie es so: Addieren Sie den Umsatz, aber nur für die Q1-Zeilen. Da SUM NULL ignoriert, tragen nicht passende Zeilen nichts zur Summe bei.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

Warum SUM NULL ignoriert

Dieses Muster funktioniert aufgrund einer Tatsache, die Interviewer häufig prüfen: Aggregatfunktionen überspringen NULL-Werte. Ein CASE ohne ELSE gibt NULL zurück, wenn kein Zweig zutrifft. Daher addiert SUM(CASE WHEN ... THEN amount END) nur die ausgewählten Zeilen.

Wenn Sie stattdessen ELSE 0 schreiben, funktioniert dies für SUM ebenfalls (das Addieren von 0 ändert nichts), verfälscht aber AVG, MIN und COUNT.

-- Both produce the same SUM result:
SUM(CASE WHEN quarter = 'Q1' THEN amount END)
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END)

Ausgearbeitetes Beispiel: Quartalsbericht

Hier ist die vollständige Abfrage für die Beispieldaten. Jede Region wird zu einer Zeile, jedes Quartal zu einer Spalte.

GROUP BY region sorgt dafür, dass die vier Eingabezeilen zu zwei Ausgabezeilen zusammengefasst werden. Ohne diese Klausel erhielten Sie eine Zeile pro Eingabezeile, die größtenteils NULL-Werte enthielte.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

-- Result:
-- region | q1  | q2
-- East   | 100 | 150
-- West   | 200 | 250

Das richtige Aggregat auswählen

Das Aggregat, in das Sie CASE einschließen, muss zur Fragestellung passen:

  • SUM, wenn jede Zelle Werte summiert.
  • MAX oder MIN, wenn jedes Regions-/Quartals-Paar genau einen Wert enthält und Sie diesen lediglich ausgeben möchten.
  • COUNT, wenn jede Zelle passende Zeilen zählt.

In Vorstellungsgesprächen wird häufig die COUNT-Variante gefragt: Wie viele Bestellungen gibt es pro Status und Monat?

SELECT
  month,
  COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped,
  COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled
FROM orders
GROUP BY month;

MAX für Zellen mit einem Wert

Wenn jedes Schlüssel-/Kategorie-Paar einen einzelnen Wert enthält (also ein echtes Kreuztabellenformat und keine Summe), verwenden Sie MAX oder MIN. Beide geben den einzigen Wert ungleich NULL zurück und ignorieren die NULL-Werte aus nicht passenden Zweigen.

Das ist die sichere Wahl, wenn Sie Attribute umstrukturieren, statt Geldbeträge zu summieren, beispielsweise beim Umwandeln einer Tabelle mit Schlüssel/Wert-Einstellungen in eine Zeile pro Entität.

-- Turn key/value rows into one wide row per user
SELECT
  user_id,
  MAX(CASE WHEN attr = 'city'  THEN value END) AS city,
  MAX(CASE WHEN attr = 'plan'  THEN value END) AS plan
FROM user_attributes
GROUP BY user_id;

Leere Ausgabezellen mit NULL behandeln

Wenn eine Region keine Umsätze in Q2 hatte, enthält ihre Zelle q2 den Wert NULL. In einem Vorstellungsgespräch werden Sie möglicherweise gebeten, stattdessen 0 auszugeben. Schließen Sie das gesamte Aggregat in COALESCE ein.

Setzen Sie COALESCE außerhalb des Aggregats, nicht innerhalb von CASE, damit Sie nur dann einen Ersatzwert einsetzen, wenn für die gesamte Gruppe keine passenden Zeilen vorhanden sind.

SELECT
  region,
  COALESCE(SUM(CASE WHEN quarter = 'Q1' THEN amount END), 0) AS q1,
  COALESCE(SUM(CASE WHEN quarter = 'Q2' THEN amount END), 0) AS q2
FROM sales
GROUP BY region;

Eine Gesamtsummenspalte hinzufügen

Eine häufige Anschlussfrage lautet: Fügen Sie eine Summe über alle pivotierten Spalten hinzu. Sie müssen die Spalten nicht namentlich addieren. Ein einfaches SUM(amount) über dieselbe Gruppe ergibt die Zeilensumme, weil es die Filterung durch CASE vollständig ignoriert.

Damit zeigen Sie der interviewenden Person, dass Sie verstehen, dass jedes Aggregat in SELECT unabhängig über dieselbe Gruppe berechnet wird.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2,
  SUM(amount) AS total
FROM sales
GROUP BY region;

Die Kurzform für gefilterte Aggregate

PostgreSQL und der SQL-Standard unterstützen FILTER (WHERE ...), eine übersichtlichere Möglichkeit, bedingte Aggregation zu formulieren. Der Ausdruck ist besser lesbar und vermeidet den CASE-Boilerplate-Code.

Erwähnen Sie diese Möglichkeit im Vorstellungsgespräch, um Ihre Bandbreite zu zeigen. Beachten Sie jedoch, dass MySQL und SQL Server sie nicht unterstützen. Daher bleibt CASE die portable Lösung.

-- Postgres / standard SQL
SELECT
  region,
  SUM(amount) FILTER (WHERE quarter = 'Q1') AS q1,
  SUM(amount) FILTER (WHERE quarter = 'Q2') AS q2
FROM sales
GROUP BY region;

Die wichtigste Einschränkung

Die bedingte Aggregation hat einen Haken, auf den Interviewerinnen und Interviewer gern eingehen: Sie müssen jede Ausgabespalte von Hand angeben. Wenn Quartale oder Kategorien nicht im Voraus bekannt sind, kann sich diese statische Abfrage nicht anpassen.

Dieses Problem wird als dynamischer Pivot bezeichnet und erfordert generiertes SQL. Für eine feste, bekannte Gruppe von Kategorien ist die bedingte Aggregation jedoch die saubere, portable Lösung.

Kurzer Test

Testen Sie, wie gut Sie das Muster der bedingten Aggregation beherrschen.

Zusammenfassung

Bedingte Aggregation ist der portable Pivot, den jede interviewende Person akzeptiert:

  • Eine CASE-Anweisung pro Ausgabespalte, eingeschlossen in ein Aggregat.
  • SUM für Summen, MAX/MIN für Zellen mit einem einzelnen Wert, COUNT für Zählungen.
  • Das funktioniert, weil Aggregate den NULL-Wert aus nicht passenden Zweigen ignorieren.
  • Verwenden Sie COALESCE, um leere Zellen in 0 umzuwandeln.
  • Einschränkung: Die Spalten müssen fest im Code angegeben werden. Als Nächstes geht es daher um dynamische Pivots.

Häufig gestellte Fragen

Ist die Lektion „Pivotieren mit bedingter Aggregation“ kostenlos?

Ja — der vollständige Text von „Pivotieren mit bedingter Aggregation“ 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 „Pivotieren mit bedingter Aggregation“?

Das portierbare Muster CASE innerhalb von SUM, um Zeilen in Spalten umzuwandeln. 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 1 von 4.

Wie lange dauert die Lektion „Pivotieren mit bedingter Aggregation“?

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

  1. Pivotieren mit bedingter Aggregation
  2. PIVOT- und Kreuztabellensyntax der Anbieter
  3. Spalten in Zeilen umwandeln
  4. Dynamische Pivots mit unbekannten Spalten
← Zurück zu SQL Interview Prep