Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL:transposição real


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