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

Truy vấn bảng chéo với các cột động trong SQL Server 2008

Truy vấn bạn sẽ cần để nhận được kết quả trong câu hỏi của mình là:

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;

Đầu ra:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Mặc dù bạn có thể tập luyện được, nhưng điều này đòi hỏi bạn phải mã hóa các chủ đề một cách khó khăn. Nếu danh sách các chủ đề của bạn có thể thay đổi, thì truy vấn này sẽ không còn phù hợp với mục đích nữa.

Nếu bạn cảm thấy thoải mái, bạn có thể khắc phục điều này bằng SQL động:

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);

Mặc dù vậy, lý tưởng nhất là bạn chỉ cần trả về một tập hợp dữ liệu, vì nó dường như nằm trong bảng nguồn của bạn và để lớp báo cáo của bạn (ví dụ:SSRS) xử lý xoay vòng, mà nó phù hợp hơn nhiều so với SQL thuần túy.



  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ỗi khi nhập tệp 5 gig vào bảng

  2. Quét ngược chỉ mục SQL Server:Hiểu và điều chỉnh hiệu suất

  3. @@ LỖI và / hoặc THỬ - CATCH

  4. varchar (500) có lợi thế hơn so với varchar (8000)?

  5. Lỗi PHP kết nối với cơ sở dữ liệu MS SQL bằng PDO_DBLIB