Não tenho certeza por que você acha que não pode fazer isso com um
UNPIVOT
e um PIVOT
:select [1], [2], [3], [4], [5]
from
(
select *
from
(
select col1, col2, col3,
row_number() over(order by col1) rn
from yourtable
) x
unpivot
(
val for col in (col1, col2, col3)
) u
) x1
pivot
(
max(val)
for rn in ([1], [2], [3], [4], [5])
) p
Consulte SQL Fiddle with Demo . Isso também pode ser realizado dinamicamente, se necessário.
Edite, se a ordem das colunas precisar ser mantida, você pode usar algo assim, que aplica o
row_number()
sem usar um order by
em uma das colunas da sua tabela (aqui está um artigo sobre como usar números de linha não determinísticos
):select [1], [2], [3], [4], [5]
from
(
select *
from
(
select col1, col2, col3,
row_number()
over(order by (select 1)) rn
from yourtable
) x
unpivot
(
val for col in (col1, col2, col3)
) u
) x1
pivot
(
max(val)
for rn in ([1], [2], [3], [4], [5])
) p;
Consulte SQL Fiddle with Demo