Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Kreuztabellenabfrage mit dynamischen Spalten in SQL Server 2008

Die Abfrage, die Sie benötigen, um die Ergebnisse Ihrer Frage zu erhalten, lautet:

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;

Ausgabe:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Wie Sie vielleicht herausfinden können, erfordert dies jedoch eine harte Codierung der Themen. Wenn sich Ihre Themenliste voraussichtlich ändern wird, ist diese Abfrage nicht mehr zweckdienlich.

Wenn Sie sich wohlfühlen, können Sie dies mit dynamischem SQL beheben:

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

Im Idealfall würden Sie jedoch einfach einen Satz von Daten zurückgeben, wie er in Ihrer Quelltabelle zu sein scheint, und Ihre Berichtsschicht (z. B. SSRS) das Pivotieren durchführen lassen, wofür sie viel besser geeignet ist als reines SQL.