sql >> Database teknologi >  >> RDS >> Sqlserver

Dynamisk pivot (række til kolonner)

Dit ønskede output er ikke helt klart, men du kan bruge både UNPIVOT og PIVOT funktion for at få resultatet

Hvis du kender antallet af kolonner, så kan du hårdkode værdierne:

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 Fiddle with Demo

Så hvis du har et ukendt antal værdier, kan du bruge 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 Fiddle with Demo

Hvis resultatet ikke er korrekt, bedes du redigere din OP og sende det resultat, som du forventer fra begge de id'er, du har angivet.




  1. hvordan man arbejder med rekursiv forespørgsel i MySql?

  2. Kan vi opdatere primære nøgleværdier for en tabel?

  3. AWS Aurora MySQL serverløs:hvordan man opretter forbindelse fra MySQL Workbench

  4. KONVERTER problem i sqlserver med Msg 529 fejl