TSQL — развернуть несколько столбцов

Как я могу развернуть несколько столбцов в «один»?

Сейчас у меня есть unpivot для каждого столбца, но это создает много пустых строк.

Смотрите скриншот, пожалуйста. введите здесь описание изображения

Вверху вы видите вводные данные. На данный момент я нахожусь за столом посередине с этим кодом:

SELECT [ID], [RowNumber],  [Year], [Sales]  FROM (
        SELECT ID, RowNumber, [Sales 2013] as [2013], [Sales 2014] as [2014]
        FROM mytable) p     UNPIVOT (
        [Sales] FOR [Year] IN ([2013], [2014])  )AS unpvt ;

Но я думаю, что было бы намного лучше добраться до структуры нижней таблицы, поскольку фактические данные содержат больше столбцов и больше лет для обработки.

Вот скрипт с примерами данных.

Надеюсь, ты покажешь мне, как туда добраться. Спасибо.


person SvenB    schedule 13.05.2013    source источник


Ответы (2)


SELECT [ID],
       [RowNumber],
       [Year],
       Sales,
       Budget
FROM   mytable
       CROSS APPLY (VALUES (2013, [Sales 2013], [Budget 2013]),
                           (2014, [Sales 2014], [Budget 2014]) ) 
                     V([Year], Sales, Budget) 

скрипт SQL

person Martin Smith    schedule 13.05.2013
comment
спасибо за оба ответа - я выберу тот, который мне легче читать и понимать :-) - person SvenB; 13.05.2013
comment
Отличный пост с поддержкой SQL Fiddle. Это помогло мне отказаться от ужасной реализации с возможным подходом Франкенштейна к UnPivot. - person GoldBishop; 04.10.2016

Один из подходов состоит в том, чтобы repivot после unpivoting - вот так:

select [Id], [Year], [Sales], [Budget], [Actual] from
(SELECT [Id],
        Left([Colhead], charindex(' ',[Colhead])-1) [Category],
        Right([Colhead], len([Colhead])-charindex(' ',[Colhead])) [Year],
        [Figures]
 FROM (SELECT * FROM mytable) p
       UNPIVOT ([Figures] FOR [Colhead] IN 
                ([Sales 2013],[Sales 2014],[Budget 2013],[Budget 2014],[Actual 2013],[Actual 2014])
      )
 AS unpvt) as u
pivot
(max([Figures]) for [Category] in ([Sales], [Budget], [Actual])) as p

SQLFiddle здесь.

person Community    schedule 13.05.2013