Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Query a campi incrociati con colonne dinamiche in SQL Server 2008

La query di cui avrai bisogno per ottenere i risultati nella tua domanda è:

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;

Uscita:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Anche se, come potresti essere in grado di capire, ciò richiede una codifica rigida dei soggetti. Se è probabile che il tuo elenco di argomenti cambi, questa query non sarà più adatta allo scopo.

Se sei a tuo agio, puoi rimediare con SQL dinamico:

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

Idealmente, tuttavia, dovresti semplicemente restituire un set di dati, come sembra essere nella tabella di origine e lasciare che il tuo livello di reporting (ad esempio SSRS) gestisca il pivot, a cui è molto più adatto rispetto al puro SQL.