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

SQLServerで行を列に効率的に変換する

    データを複数の行から列に変換する方法はいくつかあります。

    PIVOTの使用

    SQL Serverでは、PIVOTを使用できます データを行から列に変換する関数:

    select Firstname, Amount, PostalCode, LastName, AccountNumber
    from
    (
      select value, columnname
      from yourtable
    ) d
    pivot
    (
      max(value)
      for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
    ) piv;
    

    デモをご覧ください。

    不明な数のcolumnnamesを含むピボット

    columnnamesの数が不明な場合 転置したい場合は、動的SQLを使用できます:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName) 
                        from yourtable
                        group by ColumnName, id
                        order by id
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = N'SELECT ' + @cols + N' from 
                 (
                    select value, ColumnName
                    from yourtable
                ) x
                pivot 
                (
                    max(value)
                    for ColumnName in (' + @cols + N')
                ) p '
    
    exec sp_executesql @query;
    

    デモをご覧ください。

    集計関数の使用

    PIVOTを使用したくない場合 関数の場合、CASEで集計関数を使用できます 式:

    select
      max(case when columnname = 'FirstName' then value end) Firstname,
      max(case when columnname = 'Amount' then value end) Amount,
      max(case when columnname = 'PostalCode' then value end) PostalCode,
      max(case when columnname = 'LastName' then value end) LastName,
      max(case when columnname = 'AccountNumber' then value end) AccountNumber
    from yourtable
    

    デモをご覧ください。

    複数の結合を使用する

    これは複数の結合を使用して完了することもできますが、サンプルデータにない各行を関連付けるためにいくつかの列が必要になります。ただし、基本的な構文は次のようになります。

    select fn.value as FirstName,
      a.value as Amount,
      pc.value as PostalCode,
      ln.value as LastName,
      an.value as AccountNumber
    from yourtable fn
    left join yourtable a
      on fn.somecol = a.somecol
      and a.columnname = 'Amount'
    left join yourtable pc
      on fn.somecol = pc.somecol
      and pc.columnname = 'PostalCode'
    left join yourtable ln
      on fn.somecol = ln.somecol
      and ln.columnname = 'LastName'
    left join yourtable an
      on fn.somecol = an.somecol
      and an.columnname = 'AccountNumber'
    where fn.columnname = 'Firstname'
    


    1. PostgreSQLへのリモート接続を設定する方法

    2. パフォーマンスの神話:切り捨てられたカントはロールバックされます

    3. すべてのストアドプロシージャを一覧表示するクエリ

    4. MySQLDumper:PHPおよびPerlベースのMySQLデータベースバックアップツール