Heim > Datenbank > MySQL-Tutorial > Wie führe ich dynamisches Pivotieren mit mehreren Spalten in SQL Server 2008 durch?

Wie führe ich dynamisches Pivotieren mit mehreren Spalten in SQL Server 2008 durch?

Linda Hamilton
Freigeben: 2025-01-02 19:59:45
Original
975 Leute haben es durchsucht

How to Perform Dynamic Pivoting with Multiple Columns in SQL Server 2008?

Dynamisches Pivotieren mit mehreren Spalten in SQL Server

Übersicht

SQL Server bietet begrenzte Optionen zum Pivotieren von Daten über mehrere Spalten hinweg . In diesem Artikel wird untersucht, wie Sie in SQL Server 2008 eine dynamische Pivotierung mit mehr als einer Spalte mithilfe einer Kombination aus nichtpivotierendem und dynamischem SQL erreichen.

Das Problem verstehen

Das Ziel besteht darin, eine Tabelle mit mehreren Spalten umzuwandeln Spalten in ein benutzerfreundlicheres Format umwandeln, bei dem die Werte der Spalten zu Spaltenüberschriften werden. In diesem Fall enthält die Tabelle folgende Daten:

ID YEAR TYPE TOTAL VOLUME
DD1 2008 A 1000 10
DD1 2008 B 2000 20
DD1 2008 C 3000 30
DD1 2009 A 4000 40
DD1 2009 B 5000 50
DD1 2009 C 6000 60
DD2 2008 A 7000 70
DD2 2008 B 8000 80
DD2 2008 C 9000 90
DD2 2009 A 10000 100
DD2 2009 B 11000 110
DD2 2009 C 1200 120

Die gewünschte Ausgabe ist:

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 1200 120

Lösung

Pivotierung der Daten aufheben

Um mehrere Spalten zu Pivotieren, müssen Sie zunächst die Pivotierung der Daten aufheben. Dies bedeutet, die Spalten in Zeilen umzuwandeln, wobei eine Spalte „col“ den ursprünglichen Spaltennamen identifiziert und eine Wertspalte den Wert enthält.

select id, 
    col = cast(t_year as varchar(4))+'_'+t_type+'_'+col, 
    value
from ATM_TRANSACTIONS t
cross apply
(
    select 'total', total union all
    select 'volume', volume
) c (col, value);
Nach dem Login kopieren

Dynamische PIVOT-Funktion

Der nächste Schritt besteht darin, die zu verwenden PIVOT-Funktion zum Umwandeln der nicht gepivotierten Daten in das gewünschte Format. Allerdings weist SQL Server beim Pivotieren mehrerer Spalten Einschränkungen auf. Um dies zu überwinden, wird dynamisches SQL verwendet, um die PIVOT-Abfrage zur Laufzeit zu erstellen.

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(cast(t_year as varchar(4))+'_'+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, 
                    col = cast(t_year as varchar(4))+''_''+t_type+''_''+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 '

execute sp_executesql @query;
Nach dem Login kopieren

Fazit

Durch die Kombination von Unpivoting mit dynamischem SQL ist es möglich, dynamisches Pivotieren über mehrere Spalten in SQL durchzuführen Server 2008. Dies bietet eine flexible Lösung zum Umwandeln von Daten in ein benutzerfreundlicheres Format.

Das obige ist der detaillierte Inhalt vonWie führe ich dynamisches Pivotieren mit mehreren Spalten in SQL Server 2008 durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage