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

ROWSをCOLUMNSとして取得(SQL Server動的PIVOTクエリ)

    あなたがやろうとしていることはPIVOTと呼ばれています 。これを行うには、静的ピボットまたは動的ピボットの2つの方法があります。

    静的ピボット-行の値をハードコーディングして列に変換する場所です(デモ付きのSQLフィドルを参照):

    select ws_id,
      start_date,
      end_date,
      IsNull([100.00], 0) [100.00],
      IsNull([50.00], 0) [50.00],
      IsNull([20.00], 0) [20.00],
      IsNull([10.00], 0) [10.00],
      IsNull([5.00], 0) [5.00],
      IsNull([1.00], 0) [1.00]
    from 
    (
      select ws.ws_id,
        ws.start_date,
        ws.end_date,
        cd.name,
        cbw.qty
      from workshift ws
      left join currency_by_workshift cbw
        on ws.ws_id = cbw.ws_id
      left join currency_denom cd
        on cbw.cd_id = cd.cd_id
    ) x
    pivot
    (
      sum(qty)
      for name in ([100.00], [50.00], [20.00], [10.00], [5.00], [1.00])
    ) p
    

    動的ピボットは、実行時に列が決定される場所です(デモ付きのSQLフィドルを参照):

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX),
        @colsPivot AS NVARCHAR(MAX)
    
    select @colsPivot = 
      STUFF((SELECT ', IsNull(' + QUOTENAME(rtrim(name)) +', 0) as ['+ rtrim(name)+']' 
                        from currency_denom
                       GROUP BY name
                       ORDER BY cast(name as decimal(10, 2)) desc
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    select @cols = STUFF((SELECT distinct ', ' + QUOTENAME(name)
                        from currency_denom
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    
    set @query 
          = 'SELECT ws_id, start_date, end_date,' + @colsPivot + ' from 
             (
                select ws.ws_id,
                  ws.start_date,
                  ws.end_date,
                  cd.name,
                  cbw.qty
                from workshift ws
                left join currency_by_workshift cbw
                  on ws.ws_id = cbw.ws_id
                left join currency_denom cd
                  on cbw.cd_id = cd.cd_id
             ) x
             pivot 
             (
                sum(qty)
                for name in (' + @cols + ')
             ) p '
    
    execute(@query)
    

    どちらのバージョンでも同じ結果が得られます。



    1. SQLServerのGROUPINGおよびGROUPING_ID関数について

    2. ブール値のメンバー関数execute()の呼び出し

    3. LinuxおよびUNIXをAzureSQLDataWarehouseに接続する

    4. MySQL整数フィールドはPHPで文字列として返されます