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

動的ピボット (行から列へ)

    目的の出力は明確ではありませんが、 UNPIVOT の両方を使用できます および PIVOT 結果を取得する関数

    列数がわかっている場合は、値をハードコーディングできます:

    select *
    from
    (
      select id, 
        'Instance'+cast(instance as varchar(10))+'_'+col col, 
        value
      from 
      (
        select id, 
          Instance, 
          Name, 
          cast(Size as varchar(50)) Size,
          Tech
        from yourtable
      ) x
      unpivot
      (
        value
        for col in (Name, Size, Tech)
      ) u
    ) x1
    pivot
    (
      max(value) 
      for col in
        ([Instance0_Name], [Instance0_Size], [Instance0_Tech], 
         [Instance1_Name], [Instance1_Size], [Instance1_Tech], 
         [Instance2_Name], [Instance2_Size], [Instance2_Tech], 
         [Instance3_Name], [Instance3_Size], [Instance3_Tech])
    ) p
    

    デモによる SQL Fiddle を参照してください。

    次に、値の数が不明な場合は、動的 SQL を使用できます:

    DECLARE @query  AS NVARCHAR(MAX),
        @colsPivot as  NVARCHAR(MAX)
    
    select @colsPivot = STUFF((SELECT ',' 
                          + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name)
                        from yourtable t
                        cross apply sys.columns as C
                        where C.object_id = object_id('yourtable') and
                             C.name not in ('id', 'instance')
                        group by t.instance, c.name
                        order by t.instance
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    
    set @query 
      = 'select *
          from
          (
            select id, 
              ''Instance''+cast(instance as varchar(10))+''_''+col col, 
              value
            from 
            (
              select id, 
                Instance, 
                Name, 
                cast(Size as varchar(50)) Size,
                Tech
              from yourtable
            ) x
            unpivot
            (
              value
              for col in (Name, Size, Tech)
            ) u 
          ) x1
          pivot
          (
            max(value)
            for col in ('+ @colspivot +')
          ) p'
    
    exec(@query)
    

    SQL Fiddle with Demo を参照してください。

    結果が正しくない場合は、OP を編集して、提供した両方の ID から期待される結果を投稿してください。




    1. PostgreSQLでの外部適用の同等の構文は何ですか

    2. 単一のDjangoモデル、複数のテーブル?

    3. DataTableバルクの値全体をpostgreSQLテーブルに挿入します

    4. インストールされたMacPortsPHPは、MySQLとインターフェイスできなくなりました-Mac OS X