Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamischer Pivot (Zeile zu Spalten)

Ihre gewünschte Ausgabe ist nicht ganz klar, aber Sie können sowohl den UNPIVOT verwenden und PIVOT Funktion, um das Ergebnis zu erhalten

Wenn Sie die Anzahl der Spalten kennen, können Sie die Werte fest codieren:

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

Siehe SQL-Fiddle mit Demo

Wenn Sie dann eine unbekannte Anzahl von Werten haben, können Sie dynamisches SQL verwenden:

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)

Siehe SQL-Geige mit Demo

Wenn das Ergebnis nicht korrekt ist, bearbeiten Sie bitte Ihr OP und posten Sie das Ergebnis, das Sie von beiden bereitgestellten IDs erwarten.