sql >> Databasteknik >  >> RDS >> Sqlserver

Dynamisk pivot (rad till kolumn)

Din önskade utdata är inte exakt tydlig, men du kan använda både UNPIVOT och PIVOT funktion för att få resultatet

Om du vet antalet kolumner kan du hårdkoda värdena:

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

Se SQL-fiol med demo

Om du sedan har ett okänt antal värden kan du använda dynamisk 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)

Se SQL-fiol med demo

Om resultatet inte är korrekt, vänligen redigera din OP och posta resultatet som du förväntar dig från båda de ID:n du angav.




  1. MySQL spara resultat av EXECUTE i en variabel?

  2. Mysql-fel:#1247 - Referens "karma" stöds inte (hänvisning till gruppfunktion)

  3. Hur ansluter man till flera databaser på en enda PHP-sida?

  4. hur man lägger till datum i mysql-felloggen