Dynamic Pivot (от строки к столбцу)

У меня есть Table1:

ID Instance Name Size Tech
 1   0       D1  123   ABC
 1   1       D2  234   CDV
 2   2       D3  234   CDV
 2   3       D4  345   SDF

Мне нужно, чтобы набор результатов с использованием Dynamic PIVOT выглядел вместе с заголовками:

ID | Instance0_Name | Instance0_Size | Instance0_Tech | Instance1_Name | Instance1_Size | Instance1_tech
1  | D1             | 123            | ABC            | D2             | 234            | CDV

Любая помощь будет оценена по достоинству. с помощью SQL Server 2008.

Извините за предыдущий пост.


person Rodricks    schedule 08.01.2013    source источник
comment
Вы хотите, чтобы ID отображалось в конечном результате? У вас есть разные IDs, так какой из них вы хотите?   -  person Taryn    schedule 09.01.2013
comment
Я только что понял это. Спасибо, что указали на это.   -  person Rodricks    schedule 09.01.2013
comment
Вы хотите, чтобы каждое из отдельных значений идентификатора находилось в отдельной строке со всеми экземплярами, связанными с этим идентификатором, повернутыми? В конечном итоге это выглядело бы очень уродливо как набор результатов, поскольку именование основано на значении экземпляра, а значения экземпляра кажутся уникальными. Это привело бы к тому, что для каждого столбца было бы одно значение и NULL для всех экземпляров, к которым оно не применяется в строке. В зависимости от размера набора данных вы можете столкнуться с проблемой ограничения столбца.   -  person Eric J. Price    schedule 09.01.2013
comment
Идея этого запроса (который также должен применяться к другим таблицам в базе данных и объединять их все) состоит в том, чтобы получить ОДНУ таблицу со всеми полями, присутствующими в базе данных. RE-ENGINEER обратно к формату CSV-файла, где люди могут проводить собственное тестирование (сводка/диаграмма), так как сейчас у меня нет внешнего интерфейса для базы данных. Файл CSV будет большим. NULL в порядке. Максимальное ограничение столбца, я думаю, будет не более 250.   -  person Rodricks    schedule 09.01.2013
comment
возможный дубликат Использование Dynamic Pivot/Unpivot для правильного отображения   -  person RichardTheKiwi    schedule 03.05.2013


Ответы (1)


Желаемый результат не совсем ясен, но вы можете использовать функции 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 и опубликуйте результат, который вы ожидаете от обоих предоставленных вами идентификаторов.

person Taryn    schedule 08.01.2013