sql >> データベース >  >> RDS >> Sqlserver

SQL Server:列から行へ

    UNPIVOT関数を使用して、列を行に変換できます。

    select id, entityId,
      indicatorname,
      indicatorvalue
    from yourtable
    unpivot
    (
      indicatorvalue
      for indicatorname in (Indicator1, Indicator2, Indicator3)
    ) unpiv;
    

    ピボット解除する列のデータ型は同じである必要があるため、ピボット解除を適用する前にデータ型を変換する必要がある場合があることに注意してください。

    CROSS APPLYを使用することもできます UNION ALLを使用して列を変換します:

    select id, entityid,
      indicatorname,
      indicatorvalue
    from yourtable
    cross apply
    (
      select 'Indicator1', Indicator1 union all
      select 'Indicator2', Indicator2 union all
      select 'Indicator3', Indicator3 union all
      select 'Indicator4', Indicator4 
    ) c (indicatorname, indicatorvalue);
    

    SQL Serverのバージョンによっては、VALUES句でCROSSAPPLYを使用することもできます。

    select id, entityid,
      indicatorname,
      indicatorvalue
    from yourtable
    cross apply
    (
      values
      ('Indicator1', Indicator1),
      ('Indicator2', Indicator2),
      ('Indicator3', Indicator3),
      ('Indicator4', Indicator4)
    ) c (indicatorname, indicatorvalue);
    

    最後に、ピボットを解除する列が150あり、クエリ全体をハードコーディングしたくない場合は、動的SQLを使用してsqlステートメントを生成できます。

    DECLARE @colsUnpivot AS NVARCHAR(MAX),
       @query  AS NVARCHAR(MAX)
    
    select @colsUnpivot 
      = stuff((select ','+quotename(C.column_name)
               from information_schema.columns as C
               where C.table_name = 'yourtable' and
                     C.column_name like 'Indicator%'
               for xml path('')), 1, 1, '')
    
    set @query 
      = 'select id, entityId,
            indicatorname,
            indicatorvalue
         from yourtable
         unpivot
         (
            indicatorvalue
            for indicatorname in ('+ @colsunpivot +')
         ) u'
    
    exec sp_executesql @query;
    


    1. データ生成とハードウェア品質

    2. SQLServerストアドプロシージャからのAPIの呼び出し

    3. java.sql.SQLException:jdbc:microsoft:sqlserverに適したドライバーが見つかりません

    4. コマンドラインを介してLinux上のMySQLユーザーに権限を付与する