Вот и ответ. Как я упоминал в своем комментарии, это работает только в тех измерениях, с которыми вы работаете, которые известны / исправлены. Сначала образец данных:
declare @Table table (ID int not null,Foo char(1) not null,Bar char(1) not null)
insert into @Table (ID,Foo,Bar)
select 1,'A','F' union all
select 2,'B','G' union all
select 3,'C','H' union all
select 4,'D','I' union all
select 5,'E','J'
select * from @Table --As per your original data table
;with Rot1 as (
select
*
from
@Table unpivot (Value for Col in (Foo,Bar)) t
)
select * from Rot1 -- See below
;with Rot1 as (
select
*
from
@Table unpivot (Value for Col in (Foo,Bar)) t
), Rot2 as (
select
*
from Rot1 pivot (MAX(Value) for ID in ([1],[2],[3],[4],[5])) t
)
select * from Rot2 -- As per your required result
Выход при простом выборе из Rot1
:
ID Value Col
1 A Foo
1 F Bar
2 B Foo
2 G Bar
3 C Foo
3 H Bar
4 D Foo
4 I Bar
5 E Foo
5 J Bar
Итак, мы можем построить этот запрос, если мы знаем всех идентификаторов перекрестных ссылок, например, Foo
, Bar
, 1
, 2
, 3
, 4
и 5
. В большинстве случаев, когда вы хотите выполнить такое преобразование, вы не знаете всех этих значений, и поэтому SQL не является способом достижения преобразования - используйте любой инструмент, который потребляет исходные результаты для достижения такого рода переформатирования.