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

Kueri Tab Silang dengan Kolom Dinamis di SQL Server 2008

Kueri yang Anda perlukan untuk mendapatkan hasil dalam pertanyaan Anda adalah:

create table StudentResults(StudentID int,Name nvarchar(50),Course nvarchar(50), CourseLevel nvarchar(10));
insert into StudentResults values(1,'John','English','E2'),(1,'John','Maths','E3'),(1,'John','Computing','L2');

select StudentID
        ,Name
        ,[Computing]
        ,[Maths]
        ,[English]
from StudentResults
pivot(max(CourseLevel) for Course in([Computing],[Maths],[English])
     ) as p;

Keluaran:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Meskipun Anda mungkin bisa berolahraga, ini membutuhkan pengkodean mata pelajaran yang sulit. Jika daftar subjek Anda kemungkinan akan berubah, maka kueri ini tidak lagi sesuai dengan tujuan.

Jika Anda merasa nyaman, Anda dapat memperbaikinya dengan SQL dinamis:

declare @cols as  nvarchar(max)
       ,@query as nvarchar(max);

set @cols = stuff(
                   (select distinct ','+quotename(Course)
                    from StudentResults
                    for xml path(''),type).value('.','nvarchar(max)'
                   )
                 ,1,1,''
                 );

set @query = 'select StudentID
                    ,Name
                    ,'[email protected]+'
            from StudentResults
            pivot (max(CourseLevel) for Course in ('[email protected]+')
                  ) p';

execute (@query);

Namun idealnya, Anda cukup mengembalikan satu set data, seperti yang terlihat di tabel sumber Anda dan membiarkan lapisan pelaporan Anda (SSRS misalnya) menangani pivot, yang jauh lebih cocok daripada SQL murni.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menulis ulang IS BERBEDA DARI dan TIDAK BERBEDA DARI?

  2. Daftar baris kolom yang dipisahkan koma dengan grup oleh pada kolom lain

  3. Hapus SCHEMABINDING dari Fungsi Buatan Pengguna di SQL Server

  4. Perbandingan tanggal SQL Server berdasarkan bulan dan tahun saja

  5. Bagaimana cara menghentikan skala DateTimeOffset agar tidak menyebabkan ChangeConflictException di linq to Sql?