Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL:Prawdziwa transpozycja

Nie jestem pewien, dlaczego uważasz, że nie możesz tego osiągnąć za pomocą UNPIVOT i 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

Zobacz Skrzypce SQL z wersją demonstracyjną . W razie potrzeby można to również wykonać dynamicznie.

Edytuj, jeśli kolejność kolumn ma być zachowana, możesz użyć czegoś takiego, co stosuje row_number() bez użycia order by w jednej z kolumn w tabeli (tutaj znajduje się artykuł o używaniu niedeterministyczne numery wierszy ):

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;

Zobacz Skrzypce SQL z wersją demonstracyjną




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskaj wynik z dynamicznego SQL w procedurze składowanej

  2. Skrypt do usuwania wszystkich obiektów niesystemowych w SQL Server 2008

  3. masz problemy z przywróceniem zaszyfrowanej bazy danych

  4. Kiedy muszę używać początku/końca bloków i słowa kluczowego Go w programie SQL Server?

  5. Przesyłanie strumieniowe bezpośrednio do bazy danych