ホームページ > データベース > mysql チュートリアル > SQL Server の複数の列で動的ピボットを実行するにはどうすればよいですか?

SQL Server の複数の列で動的ピボットを実行するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-03 16:06:39
オリジナル
295 人が閲覧しました

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

SQL Server の複数の列に対する動的ピボット

問題:

SQL Server では、列名が変更される可能性があるテーブル内の複数の列に対して動的ピボットを実行するにはどうすればよいですか?

解決策:

複数の列で動的ピボットを実現するには、次の手順に従います:

1.データのピボットを解除します:

  • UNPIVOT または CROSS APPLY を使用して、ピボットする列のピボットを解除します。
  • この例では、「合計」と「ボリューム」をピボット解除します。 」列:
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 関数の適用:

  • ピボット先の列名を指定して、ピボットされていないデータに PIVOT 関数を適用します。
  • この場合、ピボット先とします。年とタイプ:
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.動的 SQL に変換:

  • 将来的に列名が変更される可能性がある場合は、動的ピボット T-SQL (sp_executesql など) を使用して上記のクエリを動的 SQL に変換できます。
  • 次の動的 SQL クエリは、既存のテーブルに基づいて PIVOT ステートメントを生成します。構造:
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;
ログイン後にコピー

出力:

これにより、指定された列でピボットされた結果が生成されます。結果はテーブル内のデータによって異なる場合があります。

以上がSQL Server の複数の列で動的ピボットを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート