0Pricing
Coding Interview Prep · Lektion

Dynamische Pivots mit unbekannten Spalten

Pivot-Spalten erzeugen, wenn Kategorien im Voraus nicht bekannt sind.

Dynamische Pivots mit unbekannten Spalten ist eine kostenlose Coding Interview Prep-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 Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Die schwierige Pivot-Frage

Jedes statische Pivot, ob mit einer CASE-Aggregation, mit SQL Server PIVOT oder mit Postgres crosstab, hat dieselbe Einschränkung: Sie müssen die Ausgabespalten beim Schreiben der Abfrage angeben.

Was aber, wenn die Kategorien unbekannt sind, etwa Produktnamen, die sich wöchentlich ändern, oder eine Spalte für jeden aktiven Monat? Das ist ein dynamisches Pivot. Es ist eine Frage für erfahrene Entwicklerinnen und Entwickler, weil einfaches SQL kein Ergebnis zurückgeben kann, dessen Spaltenliste erst zur Laufzeit festgelegt wird.

Warum SQL allein das nicht kann

SQL ist auf Ebene der Ergebnismenge statisch typisiert: Der Abfrageplaner muss Spalten und ihre Datentypen vor der Ausführung kennen. Eine einzelne Abfrage kann nicht sagen: Erstellen Sie eine Spalte für jeden Wert, den Sie zufällig finden.

Die allgemeingültige Vorgehensweise besteht daher darin, den SQL-Text in zwei Schritten zu generieren: Fragen Sie zuerst die unterschiedlichen Kategorien ab, erstellen Sie daraus anschließend eine Pivot-Abfrage als Zeichenkette und führen Sie diese Zeichenkette aus.

Schritt 1: Kategorien erfassen

Der erste Schritt ist eine normale Abfrage, die die unterschiedlichen Werte auflistet, aus denen später Spalten werden. Üblicherweise sortieren Sie sie, damit die Spalten eine stabile Reihenfolge haben.

Dieses Ergebnis wird im nächsten Schritt zum Erstellen der Zeichenkette verwendet. In einem echten System führen Sie die Abfrage aus, erfassen die Zeilen und setzen daraus die nächste Abfrage zusammen.

SELECT DISTINCT quarter
FROM sales
ORDER BY quarter;
-- e.g. Q1, Q2, Q3, Q4

Schritt 2: Spaltenliste erstellen

Wandeln Sie diese Werte anschließend in eine durch Kommas getrennte Liste von CASE-Ausdrücken um (oder in Namen in eckigen Klammern für PIVOT). Datenbanken stellen Funktionen zur Zeichenkettenaggregation bereit, mit denen Sie dies direkt in SQL erledigen können.

In Postgres ist das string_agg, in MySQL GROUP_CONCAT und in SQL Server STRING_AGG oder der ältere Trick mit FOR XML PATH.

-- Postgres: build the SELECT-list fragment
SELECT string_agg(
  format('SUM(CASE WHEN quarter = %L THEN amount END) AS %I',
         quarter, quarter),
  ', '
)
FROM (SELECT DISTINCT quarter FROM sales ORDER BY 1) q;

Schritt 3: Zusammensetzen und Ausführen

Verketten Sie das generierte Fragment zu einer vollständigen Abfrage als Zeichenkette und führen Sie diese anschließend dynamisch aus: mit EXECUTE in PL/pgSQL, mit sp_executesql in SQL Server oder mit PREPARE/EXECUTE in MySQL.

Das ist der Kern eines dynamischen Pivots: SQL schreibt SQL und führt es anschließend aus.

-- SQL Server pattern
DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX);
SELECT @cols = STRING_AGG(QUOTENAME(quarter), ',')
FROM (SELECT DISTINCT quarter FROM sales) q;
SET @sql = N'SELECT region, ' + @cols + '
  FROM (SELECT region, quarter, amount FROM sales) s
  PIVOT (SUM(amount) FOR quarter IN (' + @cols + ')) p;';
EXEC sp_executesql @sql;

Vollständiges PostgreSQL-Beispiel

In Postgres verpacken Sie die drei Schritte in einen DO-Block oder eine Funktion. Erstellen Sie die Spaltenliste mit string_agg, fügen Sie sie in die Abfrage ein und führen Sie diese mit EXECUTE aus.

Da die Ergebnisspalten erst zur Laufzeit bekannt sind, verwendet eine Funktion, die dieses Ergebnis zurückgibt, häufig RETURNS SETOF record oder gibt die Zeilen als json zurück, das der Aufrufer anschließend erweitert.

DO $do$
DECLARE
  cols text;
  qry  text;
BEGIN
  SELECT string_agg(
    format('SUM(CASE WHEN quarter=%L THEN amount END) AS %I', quarter, quarter), ', ')
  INTO cols
  FROM (SELECT DISTINCT quarter FROM sales ORDER BY 1) q;
  qry := format('SELECT region, %s FROM sales GROUP BY region', cols);
  EXECUTE qry;
END $do$;

MySQL mit vorbereiteten Anweisungen

MySQL verfügt über keinen Pivot-Operator. Daher erstellen dynamische Pivots mit GROUP_CONCAT eine Zeichenkette für eine bedingte Aggregation und führen sie anschließend über eine vorbereitete Anweisung aus.

GROUP_CONCAT hat eine Längenbegrenzung (group_concat_max_len), auf die Interviewer möglicherweise hinweisen. Erhöhen Sie sie, wenn Sie viele Kategorien haben.

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
  CONCAT('SUM(CASE WHEN quarter=''', quarter,
         ''' THEN amount END) AS ', QUOTE(quarter))
) INTO @sql FROM sales;
SET @sql = CONCAT('SELECT region, ', @sql,
                  ' FROM sales GROUP BY region');
PREPARE st FROM @sql; EXECUTE st; DEALLOCATE PREPARE st;

Das Risiko einer SQL-Injection

Da Sie Datenwerte in ausführbares SQL verketten, bergen dynamische Pivots ein Injektionsrisiko. Wenn ein Kategorienwert ein Anführungszeichen oder schädlichen Text enthält, kann er die generierte Abfrage beschädigen oder übernehmen.

Maskieren Sie Bezeichner und Literale immer mit den sicheren Hilfsfunktionen der jeweiligen Engine: format('%I', ...) und %L in Postgres sowie QUOTENAME in SQL Server. Fügen Sie niemals rohe Werte direkt in die Zeichenkette ein.

-- Safe quoting prevents injection / breakage
-- Postgres: %I identifier, %L literal
format('SUM(CASE WHEN k=%L THEN v END) AS %I', cat, cat)
-- SQL Server: QUOTENAME(cat)

Unbekannte Spalten zurückgeben

Eine zweite Schwierigkeit besteht darin, dass der Aufrufer die Ergebnisstruktur im Voraus nicht kennen kann. Häufig akzeptierte Vorgehensweisen in Interviews sind:

  • Geben Sie die Zeilen als JSON zurück und lassen Sie die Anwendungsebene die Schlüssel erweitern.
  • Lassen Sie die Prozedur die Abfrage ausgeben oder erstellen und führen Sie sie in einem zweiten Schritt aus.
  • Führen Sie das abschließende Pivotieren im Anwendungscode (pandas, BI-Tool) durch, sobald die Kategorien bekannt sind.

Es gibt keine saubere Möglichkeit, aus einem einzigen statischen Aufruf beliebige Spalten zurückzugeben.

Ausgearbeitetes Beispiel: Pivotieren nach Produkt

Angenommen, Produkte kommen hinzu und fallen weg, und der Bericht benötigt eine Umsatzspalte für jedes aktuell in sales enthaltene Produkt. Sie können die Liste nicht fest codieren, also generieren Sie sie. Postgres macht dies gut lesbar: Erstellen Sie das CASE-Fragment mit string_agg und sicherem Quoting, fügen Sie es in eine Abfrage ein und führen Sie diese anschließend mit EXECUTE aus.

Führen Sie den Interviewer durch die einzelnen Schritte: Produkte ermitteln, jedes Produkt in eine Spalte mit korrektem Quoting umwandeln, alles zusammensetzen und ausführen. Dasselbe Muster gilt für jede Engine; nur die Hilfsfunktionen ändern sich.

DO $do$
DECLARE cols text; qry text;
BEGIN
  SELECT string_agg(
    format('SUM(CASE WHEN product=%L THEN amount END) AS %I',
           product, product), ', ')
  INTO cols
  FROM (SELECT DISTINCT product FROM sales ORDER BY 1) p;
  qry := format('SELECT region, %s FROM sales GROUP BY region', cols);
  EXECUTE qry;
END $do$;

Wann Sie dynamische Pivots vermeiden sollten

Gute Kandidatinnen und Kandidaten wissen, wann sie dies nicht in SQL erledigen sollten. Dynamisches SQL ist schwieriger zu lesen, zu testen, abzusichern und zwischenzuspeichern. Häufig ist die bessere Antwort:

  • Geben Sie das Langformat aus SQL zurück und pivotieren Sie in der Anwendung oder in der Berichtsebene.
  • Wenn die Kategorienmenge klein ist und sich nur langsam ändert, verwenden Sie ein statisches Pivot und aktualisieren Sie es gelegentlich.

Verwenden Sie dynamische Pivots nur für tatsächlich offene, sich ständig ändernde Kategorienmengen.

Kurzer Check

Prüfen Sie den grundlegenden Grund für dynamische Pivots.

Zusammenfassung

Dynamische Pivots verarbeiten unbekannte Spaltenmengen:

  • Statische Pivots scheitern, weil die Ergebnisspalten vor der Ausführung feststehen müssen.
  • Muster: unterschiedliche Kategorien abfragen, eine Pivot-SQL-Zeichenkette erstellen und sie dynamisch ausführen.
  • Verwenden Sie string_agg/GROUP_CONCAT/STRING_AGG, um die Spaltenliste zu erstellen.
  • Maskieren Sie Werte (%I/%L, QUOTENAME), um SQL-Injection zu vermeiden.
  • Oft ist es sauberer, das Langformat zurückzugeben und in der Anwendungsebene zu pivotieren.

Häufig gestellte Fragen

Ist die Lektion „Dynamische Pivots mit unbekannten Spalten“ kostenlos?

Ja — der vollständige Text von „Dynamische Pivots mit unbekannten Spalten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Dynamische Pivots mit unbekannten Spalten“?

Pivot-Spalten erzeugen, wenn Kategorien im Voraus nicht bekannt sind. Du übst Coding 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 Coding Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. Coding 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 4 von 4.

Wie lange dauert die Lektion „Dynamische Pivots mit unbekannten Spalten“?

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 Coding Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede Coding 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 Coding Interview Prep