Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Dynamic Pivot (ред към колони)

Желаният от вас резултат не е съвсем ясен, но можете да използвате и двата 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 с демонстрация

Ако резултатът не е правилен, тогава, моля, редактирайте вашата OP и публикувайте резултата, който очаквате и от двата идентификатора, които сте предоставили.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_VALUE() Примери в SQL Server (T-SQL)

  2. Индексът е извън границите на масива. (Microsoft.SqlServer.smo)

  3. ред преобразува в колона в sql 2008

  4. OPENROWSET не приема променливи за своите аргументи (SQL Server)

  5. Как да преименувате име на таблица в SQL Server