- Kategorien:
PIVOT¶
Rotiert eine Tabelle, indem die eindeutigen Werte aus einer Spalte im Eingabeausdruck in mehrere Spalten verwandelt und Ergebnisse bei Bedarf für alle verbleibenden Spaltenwerte aggregiert werden. Bei einer Abfrage wird er in der FROM-Klausel nach dem Tabellennamen oder der Unterabfrage angegeben.
PIVOT unterstützt die folgenden integrierten Aggregatfunktionen:
PIVOT kann dazu dienen, eine schmale Tabelle (zum Beispiel empid, month, sales) in eine breitere Tabelle zu verwandeln (zum Beispiel empid, jan_sales, feb_sales, mar_sales).
- Siehe auch:
Syntax¶
Parameter¶
aggregate_functionDie Aggregatfunktion zum Zusammenfassen der gruppierten Werte aus
pivot_column.pivot_column [ [ AS ] alias ]Die Spalte aus der Quelltabelle oder Unterabfrage, die aggregiert wird.
Die optionale
[ AS ] alias-Klausel gibt den Alias an, der für das Aggregat im Ergebnis der PIVOT-Operation verwendet werden soll. An jeden Pivot-Spaltennamen wird ein Unterstrich und dann der Alias angehängt. Wenn beispielsweise deraliastotalist, dann hängt die Pivot-Operation an den Namen der Pivot-Spalten_TOTALan. Das Schlüsselwort AS ist optional.value_columnDie Spalte aus der Quelltabelle oder Unterabfrage, die die Werte enthält, aus denen Spaltennamen generiert werden.
pivot_value_N [ [ AS ] alias ]Eine Liste von Werten für die Pivotspalte, die in den Abfrageergebnissen in Überschriften pivotiert werden.
Die optionale
[ AS ] alias-Klausel gibt den Alias an, der für den Wert im Ergebnis der PIVOT-Operation verwendet werden soll. Der Alias ersetzt den Wert.ANY [ ORDER BY ... ]Pivot auf alle diskreten Werte der Pivot-Spalte. Um die Reihenfolge der Pivot-Spalten in der Ausgabe zu steuern, geben Sie nach dem Schlüsselwort ANY eine ORDER BY-Klausel an. Wenn die Pivot-Spalte NULL-Werte enthält, wird NULL ebenfalls als Pivot-Wert behandelt.
subqueryPivot auf alle in der Unterabfrage gefundenen Werte. Das Schlüsselwort DISTINCT ist erforderlich, wenn die Unterabfrage eine ORDER BY-Klausel enthält. Die Unterabfrage muss eine unkorrelierte Unterabfrage sein, die eine einzelne Spalte zurückgibt. Die Pivotierung wird für alle diskreten Werte ausgeführt, die von der Unterabfrage zurückgegeben werden. Weitere Informationen zu unkorrelierten Unterabfragen finden Sie unter Verwenden von Unterabfragen.
DEFAULT ON NULL(value)Ersetzt alle NULL-Werte im Pivot-Ergebnis durch den angegebenen Standardwert. Der Standardwert kann ein beliebiger skalarer Ausdruck sein, der nicht von der Pivot- und Aggregationsspalte abhängt.
Nutzungshinweise¶
Snowflake unterstützt dynamisches Pivot. Bei der dynamischen Pivot-Abfrage wird das Schlüsselwort ANY oder eine Unterabfrage in der PIVOT-Unterklausel verwendet, anstatt die Pivot-Werte explizit anzugeben.
Wenn in einer Definition der Ansicht ein dynamisches Pivot verwendet wird, können Abfragen in der Ansicht fehlschlagen, wenn sich die zugrunde liegenden Daten ändern, sodass die Pivot-Ausgabespalten geändert werden.
Dynamische Pivotierung wird im Body einer gespeicherten Prozedur oder einer benutzerdefinierten Funktion (UDF) nicht unterstützt.
Eine Pivot-Abfrage, die kein dynamisches Pivot verwendet, kann eine Ausgabe mit doppelten Spalten zurückgeben. Wir empfehlen, eine Ausgabe mit doppelten Spalten zu vermeiden. Eine dynamische Pivot-Abfrage entdupliziert doppelte Spalten.
Eine Pivot-Abfrage, die kein dynamisches Pivot verwendet, schlägt möglicherweise fehl, wenn sie versucht, mit CAST eine VARIANT-Spalte in einen anderen Datentyp umzuwandeln. Bei dynamischen Pivot-Abfragen gibt es diese Beschränkung nicht.
Derzeit erlaubt die PIVOT-Semantik keine Mehrfachaggregationen, aber Sie können ähnliche Ergebnisse erzielen, indem Sie PIVOT mit dem Operator UNION verwenden. Ein Beispiel dazu finden Sie unter Dynamisches Pivot mit mehreren Aggregationen mit UNION.
Beispiele¶
In den PIVOT-Beispielen wird die folgende quarterly_sales-Tabelle verwendet:
Die folgenden Beispiele verwenden PIVOT:
Automatisches Pivot auf allen diskreten Spaltenwerten mit dynamischem Pivot
Pivot auf einer angegebenen Liste von Spaltenwerten für die Pivot-Spalte
Automatisches Pivot auf allen diskreten Spaltenwerten mit dynamischem Pivot¶
In der Tabelle quarterly_sales können Sie mit dem Schlüsselwort ANY auf der Spalte amount pivotieren, um den Gesamtumsatz pro Mitarbeiter für alle einzelnen Quartale zu summieren. Geben Sie ORDER BY an, damit die Pivot-Spalten in der richtigen Reihenfolge stehen:
Das folgende Beispiel ist dasselbe wie das vorherige, nur wird der Alias _TOTAL zu jedem Pivot-Spaltennamen hinzugefügt:
Dynamisches Pivot auf Spaltenwerte mit einer Unterabfrage¶
Angenommen, dass zusätzlich zur Tabelle quarterly_sales eine Tabelle ad_campaign_types_by_quarter die Typen von Werbeanzeigen erfasst, die in bestimmten Quartalen geschaltet werden. Diese Tabelle hat die folgende Struktur und Daten:
Sie können eine Unterabfrage in einer Pivot-Abfrage verwenden, um die Summe der Umsätze in den Quartalen zu ermitteln, in denen bestimmte Anzeigenkampagnen durchgeführt wurden. Die folgende Pivot-Abfrage gibt zum Beispiel nur Daten für Quartale mit TV-Kampagnen zurück:
Dynamisches Pivot mit mehreren Aggregationen mit UNION¶
Sie können den UNION-Operator verwenden, um mehrere Aggregationen in einem einzigen Resultset anzuzeigen. Dieses Beispiel verwendet dynamisches Pivot und den UNION-Operator, um die folgenden Informationen für jeden Mitarbeiter in jedem Quartal anzuzeigen:
Der durchschnittliche Betrag eines Verkaufs unter Verwendung der Funktion AVG.
Der Verkauf mit dem höchsten Wert unter Verwendung der Funktion MAX.
Der Verkauf mit dem niedrigsten Wert unter Verwendung der Funktion MIN.
Die Anzahl der Verkäufe unter Verwendung der Funktion COUNT.
Der Gesamtbetrag für alle Verkäufe unter Verwendung der Funktion SUM.
Führen Sie die Abfrage aus:
Dynamisches Pivot mit einer Verknüpfungsabfrage¶
Um Pivot in einer Abfrage mit einer Verknüpfung auszuführen, können Sie einen allgemeinen Tabellenausdruck (Common Table Expression, CTE) für die Pivot-Abfrage verwenden.
Nehmen wir zum Beispiel an, eine einfache Tabelle ordnet Mitarbeiter Managern zu:
Führen Sie eine Abfrage aus, die die Tabelle emp_manager mit der Tabelle quarterly_sales verknüpft und die Spalte amount in der Tabelle quarterly_sales pivotiert:
Pivot auf einer angegebenen Liste von Spaltenwerten für die Pivot-Spalte¶
Ausgehend von der Tabelle quarterly_sales können Sie in der Spalte amount den Gesamtumsatz pro Mitarbeiter für die angegebenen Quartale summieren:
Sie können auf allen Quartalen in der Spalte amount pivotieren, indem Sie die folgende Abfrage ausführen:
Sie können die Spaltennamen in der Ausgabe mit der AS-Klausel ändern. Um zum Beispiel die Spaltennamen zu kürzen und ohne Anführungszeichen anzuzeigen, führen Sie die folgende Abfrage aus:
Pivot mit einem Standardwert für NULL–Werte¶
Wenn die Abfrage NULL-Werte zurückgibt, können Sie diese durch einen Standardwert ersetzen, indem Sie DEFAULT ON NULL verwenden. Sie können z. B. dynamisches Pivot verwenden und die NULL-Werte durch einen Standardwert von 0 ersetzen, indem Sie die folgende Abfrage ausführen:
Sie können auch DEFAULT ON NULL mit einer bestimmten Liste von Spalten verwenden:
Pivot-Beispiele, die mehrere Spalten umfassen¶
Pivot-Abfragen können mit mehreren Spalten arbeiten. Bevor Sie diese Beispiele ausführen, fügen Sie der Tabelle quarterly_sales eine Spalte hinzu und füllen Sie diese mit Zufallswerten.
Fügen Sie zunächst in der Tabelle quarterly_sales eine Spalte hinzu, in der der Rabatt für jeden Verkauf erfasst wird:
Füllen Sie die neue Spalte mit zufälligen Werten zwischen 0 und 5, die den Rabattprozentsatz für jeden Verkauf angeben:
Fragen Sie die Tabelle ab, um die neue Spalte mit den hinzugefügten Zufallswerten anzuzeigen:
Jetzt, wo die neue Spalte hinzugefügt und ausgefüllt ist, führen Sie die folgenden Beispiele aus:
Spalten mit einer CTE von einer Pivot-Abfrage ausschließen¶
Sie können einen allgemeinen Tabellenausdruck (Common Table Expression, CTE) verwenden, um Spalten von einer Pivot-Abfrage auszuschließen.
Das folgende Beispiel verwendet einen CTE, um die Spalte discount_percent von einer Pivot-Abfrage auszuschließen:
Sie können einen CTE verwenden, um die Spalte amount auszuschließen und den durchschnittlichen Rabatt anzuzeigen, den jeder Mitarbeiter in jedem Quartal gewährt hat:
Ausführen einer multidimensionalen Pivot-Abfrage¶
Eine multidimensionale Pivot-Abfrage pivotiert auf mehr als einer Spalte. Dieses Beispiel pivotiert auf den Spalten amount und discount_percentage. Die Abfrage gibt die Summe aller Verkäufe aller Mitarbeiter pro Quartal und den maximalen Rabattprozentsatz für alle Verkäufe pro Quartal zurück.
In der Abfrage verwendet die SELECT-Liste die Parameter $col_position, um die Funktionen SUM und MAX der Reihe nach auf die zurückgegebenen Spalten anzuwenden und um die zurückgegebenen Spalten zu benennen. Eine Unterabfrage in der FROM-Klausel liefert die Daten für die Pivot-Operationen. Da die Ausgabe die Verkaufsergebnisse für alle Mitarbeiter zeigt, enthält die Unterabfrage nicht die Spalte empid.