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

Pivot tanpa fungsi agregat di MSSQL 2008 R2

Anda dapat menggunakan fungsi PIVOT untuk mendapatkan hasilnya, Anda hanya perlu menggunakan row_number() untuk membantu.

Kueri dasar untuk ini adalah:

select skill_id, skill, parameter,
  row_number() over(partition by skill, skill_id order by skill_id) rn
from yt;

Lihat SQL Fiddle dengan Demo . Saya menggunakan row_number() untuk menerapkan nilai yang berbeda untuk setiap baris dalam skill dan skill_id , Anda kemudian akan menggunakan nilai nomor baris ini sebagai kolom untuk PIVOT.

Kode lengkap dengan PIVOT yang diterapkan adalah:

select skill_id, skill,[Parameter_1], [Parameter_2], [Parameter_3]
from 
(
  select skill_id, skill, parameter,
    'Parameter_'+cast(row_number() over(partition by skill, skill_id 
                                     order by skill_id) as varchar(10)) rn
  from yt
) d
pivot
(
  max(parameter)
  for rn in ([Parameter_1], [Parameter_2], [Parameter_3])
) piv;

Lihat SQL Fiddle dengan Demo .

Dalam kasus Anda, sepertinya Anda akan memiliki jumlah parameter yang tidak diketahui untuk setiap keterampilan. Jika itu benar, maka Anda akan ingin menggunakan SQL dinamis untuk mendapatkan hasilnya:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Parameter_'
                          +cast(row_number() over(partition by skill, skill_id 
                               order by skill_id) as varchar(10))) 
                    from yt
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT skill_id, skill,' + @cols + ' from 
             (
                select skill_id, skill, parameter,
                  ''Parameter_''+cast(row_number() over(partition by skill, skill_id 
                                   order by skill_id) as varchar(10)) rn
                from yt
            ) x
            pivot 
            (
                max(parameter)
                for rn in (' + @cols + ')
            ) p '

execute(@query);

Lihat SQL Fiddle dengan 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. Hitung Total Berjalan di SQL Server

  2. Gabungkan 2 database SQL Server

  3. Cara melaporkan kesalahan dari fungsi yang ditentukan pengguna SQL Server

  4. Hitung nilai duplikat berturut-turut dalam SQL

  5. Tujuan SQL Server vs Tujuan OLE DB