Heim >Datenbank >MySQL-Tutorial >Wie führe ich dynamisches Pivotieren für mehrere Spalten in SQL Server durch?

Wie führe ich dynamisches Pivotieren für mehrere Spalten in SQL Server durch?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-03 16:06:39317Durchsuche

How to Perform Dynamic Pivoting on Multiple Columns in SQL Server?

Dynamisches Pivotieren über mehrere Spalten in SQL Server

Problem:

In SQL Server Wie können wir einen dynamischen Pivot über mehrere Spalten in einer Tabelle durchführen, wobei sich die Spaltennamen in ändern können? Zukunft?

Lösung:

Um eine dynamische Pivotierung mit mehreren Spalten zu erreichen, befolgen Sie diese Schritte:

1. Entpivotieren Sie die Daten:

  • Entpivotieren Sie die Spalten, die Sie Pivotieren möchten, indem Sie UNPIVOT oder CROSS APPLY verwenden.
  • In unserem Beispiel möchten wir „Gesamt“ und „Volumen“ entpivotieren " Spalten:
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);

2. PIVOT-Funktion anwenden:

  • Wenden Sie die PIVOT-Funktion auf die nicht pivotierten Daten an und geben Sie die Spaltennamen an, zu denen Sie Pivot durchführen möchten.
  • In unserem Fall möchten wir Pivot durchführen Jahre und Typen:
select 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]
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)
) d
pivot
(
    max(value)
    for col in ([2008_A_total], [2008_A_volume], [2008_B_total], [2008_B_volume],
                [2008_C_total], [2008_C_volume], [2009_A_total], [2009_A_volume])
) piv;

3. In dynamisches SQL konvertieren:

  • Wenn sich die Spaltennamen in Zukunft ändern können, können Sie die obige Abfrage mit dynamischem Pivot-T-SQL (z. B. sp_executesql) in dynamisches SQL konvertieren.
  • Die folgende dynamische SQL-Abfrage generiert die PIVOT-Anweisung basierend auf der vorhandenen Tabelle Struktur:
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;

Ausgabe:

Dadurch wird ein Pivot-Ergebnis mit den angegebenen Spalten generiert. Die Ergebnisse können je nach den Daten in Ihrer Tabelle variieren.

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

Stellungnahme:
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