Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL :transposition réelle

Je ne sais pas pourquoi vous pensez que vous ne pouvez pas accomplir cela avec un UNPIVOT et un 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

Voir SQL Fiddle avec démo . Cela pourrait également être effectué dynamiquement si nécessaire.

Edit, si l'ordre des colonnes doit être conservé, vous pouvez utiliser quelque chose comme ça, qui applique le row_number() sans utiliser de order by sur l'une des colonnes de votre table (voici un article sur l'utilisation numéros de ligne non déterministes ):

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;

Voir SQL Fiddle avec démo