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

Xoay vòng động (hàng đến cột)

Đầu ra mong muốn của bạn không rõ ràng chính xác, nhưng bạn có thể sử dụng cả UNPIVOTPIVOT hàm lấy kết quả

Nếu bạn biết số lượng cột, thì bạn có thể mã hóa các giá trị:

select *
from
(
  select id, 
    'Instance'+cast(instance as varchar(10))+'_'+col col, 
    value
  from 
  (
    select id, 
      Instance, 
      Name, 
      cast(Size as varchar(50)) Size,
      Tech
    from yourtable
  ) x
  unpivot
  (
    value
    for col in (Name, Size, Tech)
  ) u
) x1
pivot
(
  max(value) 
  for col in
    ([Instance0_Name], [Instance0_Size], [Instance0_Tech], 
     [Instance1_Name], [Instance1_Size], [Instance1_Tech], 
     [Instance2_Name], [Instance2_Size], [Instance2_Tech], 
     [Instance3_Name], [Instance3_Size], [Instance3_Tech])
) p

Xem SQL Fiddle với Demo

Sau đó, nếu bạn có một số lượng giá trị không xác định, bạn có thể sử dụng sql động:

DECLARE @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT ',' 
                      + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name)
                    from yourtable t
                    cross apply sys.columns as C
                    where C.object_id = object_id('yourtable') and
                         C.name not in ('id', 'instance')
                    group by t.instance, c.name
                    order by t.instance
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select *
      from
      (
        select id, 
          ''Instance''+cast(instance as varchar(10))+''_''+col col, 
          value
        from 
        (
          select id, 
            Instance, 
            Name, 
            cast(Size as varchar(50)) Size,
            Tech
          from yourtable
        ) x
        unpivot
        (
          value
          for col in (Name, Size, Tech)
        ) u 
      ) x1
      pivot
      (
        max(value)
        for col in ('+ @colspivot +')
      ) p'

exec(@query)

Xem SQL Fiddle với Demo

Nếu kết quả không chính xác, vui lòng chỉnh sửa OP của bạn và đăng kết quả mà bạn mong đợi từ cả hai Id mà bạn đã cung cấp.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt giữa sys.sql_modules, sys.system_sql_modules và sys.all_sql_modules trong SQL Server

  2. Làm thế nào để xây dựng một câu lệnh SQL bằng cách sử dụng các ID có thể không có sẵn trong bảng?

  3. Hành vi của chỉ mục duy nhất, cột varchar và khoảng trắng (trống)

  4. Cách tìm đối chiếu cơ sở dữ liệu được hỗ trợ bởi phiên bản máy chủ SQL của bạn

  5. Bộ lập lịch công việc SSIS không thành công, nhưng chạy tốt trong BIDS và trong Dịch vụ tích hợp MSDB