Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pivot Dinamis (baris ke kolom)

Output yang Anda inginkan tidak terlalu jelas, tetapi Anda dapat menggunakan keduanya UNPIVOT dan PIVOT berfungsi untuk mendapatkan hasil

Jika Anda mengetahui jumlah kolom, maka Anda dapat mengkodekan nilainya dengan keras:

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

Lihat SQL Fiddle dengan Demo

Kemudian jika Anda memiliki jumlah nilai yang tidak diketahui, Anda dapat menggunakan sql dinamis:

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)

Lihat SQL Fiddle dengan Demo

Jika hasilnya tidak benar, silakan edit OP Anda dan posting hasil yang Anda harapkan dari kedua Id yang Anda berikan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah ada bug di SqlDataReader.HasRows saat dijalankan terhadap SQL Server 2008?

  2. Bisakah saya menentukan pemecah kata mana yang digunakan saat membuat indeks teks lengkap mssql?

  3. Mesin Virtual Azure untuk Penggunaan SQL Server

  4. Pernyataan SEPERTI SQL pada Jenis DateTime

  5. Ubah waktu desimal menjadi jam dan menit