Dieser Artikel befasst sich mit der Herausforderung, einen dynamischen Pivot-Vorgang für mehrere Spalten in Microsoft durchzuführen SQL-Server. Das Ziel besteht darin, Daten in ein Pivot-Tabellenformat umzuwandeln, wobei Zeilen unterschiedliche Werte in einer bestimmten Spalte und Spalten Werte aus anderen Spalten darstellen.
Bevor Sie den Pivot-Vorgang ausführen, Die Daten müssen unpivotiert sein. Bei diesem Prozess werden die Daten umgeformt, indem mehrere Spalten in Zeilen umgewandelt werden. In diesem Fall ist die Pivotierung der Spalten „Gesamt“ und „Volumen“ aufgehoben.
SELECT ID, CONCAT(T_YEAR, '_', T_TYPE, '_', COL) AS COL, VALUE FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT 'total', TOTAL UNION ALL SELECT 'volume', VOLUME ) c (COL, VALUE)
Sobald die Pivotierung der Daten aufgehoben ist, kann die dynamische Pivot-Abfrage erstellt werden. Diese Abfrage erstellt die erforderlichen Spalten für die Pivot-Tabelle dynamisch basierend auf den nicht pivotierten Daten.
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); SELECT @cols = STUFF((SELECT ',' + QUOTENAME(CONCAT(T_YEAR, '_', T_TYPE, '_', COL)) FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT 'total', 1 UNION ALL SELECT 'volume', 2 ) c (COL, SO) GROUP BY COL, SO, T_TYPE, T_YEAR ORDER BY T_YEAR, T_TYPE, SO FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,''); SET @query = 'SELECT ID,' + @cols + ' FROM ( SELECT ID, CONCAT(T_YEAR, ''_''+T_TYPE+''_''+COL) AS COL, VALUE FROM ATM_TRANSACTIONS t CROSS APPLY ( SELECT ''total'', TOTAL UNION ALL SELECT ''volume'', VOLUME ) c (COL, VALUE) ) x PIVOT ( MAX(VALUE) FOR COL IN (' + @cols + ') ) p ';
Die dynamische Abfrage wird mithilfe der gespeicherten Prozedur sp_executesql ausgeführt. Diese Prozedur nimmt die vom dynamischen SQL-Code generierte Abfrage und führt sie aus.
EXECUTE SP_EXECUTESQL @QUERY;
Die Ausgabe der dynamischen Pivot-Operation ist eine Pivot-Tabelle mit unterschiedlichen ID-Werten als Zeilen und Spalten Stellt die nicht gepivotierten Gesamt- und Volumenwerte für jede Kombination aus T_YEAR und T_TYPE dar. Das Ergebnis wird wie folgt sein:
ID | 2008_A_TOTAL | 2008_A_VOLUME | 2008_B_TOTAL | 2008_B_VOLUME | 2008_C_TOTAL | 2008_C_VOLUME | 2009_A_TOTAL | 2009_A_VOLUME | 2009_B_TOTAL | 2009_B_VOLUME | 2009_C_TOTAL | 2009_C_VOLUME |
---|---|---|---|---|---|---|---|---|---|---|---|---|
DD1 | 1000 | 10 | 2000 | 20 | 3000 | 30 | 4000 | 40 | 5000 | 50 | 6000 | 60 |
DD2 | 7000 | 70 | 8000 | 80 | 9000 | 90 | 10000 | 100 | 11000 | 110 | 12000 | 120 |
Das obige ist der detaillierte Inhalt vonWie kann man mehrere Spalten in SQL Server dynamisch Pivotieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!