Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL:Reelle Transponierung

Ich bin mir nicht sicher, warum Sie denken, dass Sie dies nicht mit einem UNPIVOT erreichen können und ein 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

Siehe SQL Fiddle mit Demo . Dies könnte bei Bedarf auch dynamisch durchgeführt werden.

Bearbeiten Sie, wenn die Spaltenreihenfolge beibehalten werden muss, können Sie so etwas verwenden, das die row_number() anwendet ohne order by zu verwenden in einer der Spalten in Ihrer Tabelle (hier ist ein Artikel über die Verwendung von nicht deterministische Zeilennummern ):

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;

Siehe SQL-Fiddle mit Demo