Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL:Transpose thực

Tôi không rõ tại sao bạn nghĩ rằng bạn không thể thực hiện được điều này với UNPIVOT và một 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

Xem SQL Fiddle with Demo . Điều này cũng có thể được thực hiện động nếu cần.

Chỉnh sửa, nếu thứ tự cột cần được giữ lại, thì bạn có thể sử dụng một cái gì đó như thế này, áp dụng row_number() mà không cần sử dụng order by trên một trong các cột trong bảng của bạn (đây là bài viết về cách sử dụng số hàng không xác định ):

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;

Xem SQL Fiddle với Demo




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để ngăn quy mô DateTimeOffset gây ra một ChangeConflictException trong linq thành Sql?

  2. T-SQL - Có cách nào (miễn phí) để so sánh dữ liệu trong hai bảng không?

  3. Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng 'bảng' khi IDENTITY_INSERT được đặt thành TẮT

  4. Sự khác biệt giữa kết nối trái và tham gia phải trong SQL Server

  5. Chốt khóa từ Phạm vi khóa trên chỉ mục khóa chính