sql >> Databáze >  >> RDS >> Sqlserver

Dynamický pivot (od řádků ke sloupcům)

Požadovaný výstup není přesně jasný, ale můžete použít oba UNPIVOT a PIVOT funkce k získání výsledku

Pokud znáte počet sloupců, můžete hodnoty pevně zakódovat:

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

Viz SQL Fiddle s ukázkou

Pokud pak máte neznámý počet hodnot, můžete použít dynamické 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)

Viz SQL Fiddle s ukázkou

Pokud výsledek není správný, upravte prosím svůj OP a odešlete výsledek, který očekáváte od obou vámi poskytnutých ID.




  1. Hibernate nemohl načíst SequenceInformation z databáze

  2. Jak mohu analyzovat pole JSON v postgresql?

  3. Převod výsledků MySQL z řádků na sloupce

  4. Oracle objednávejte za různých podmínek