Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête d'analyse croisée avec des colonnes dynamiques dans SQL Server 2008

La requête dont vous aurez besoin pour obtenir les résultats de votre question est :

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;

Sortie :

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Bien que vous puissiez vous en sortir, cela nécessite un codage rigoureux des sujets. Si votre liste de sujets est susceptible de changer, alors cette requête ne sera plus adaptée à votre objectif.

Si vous êtes à l'aise, vous pouvez y remédier avec SQL dynamique :

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

Idéalement, cependant, vous renverriez simplement un ensemble de données, tel qu'il apparaît dans votre table source et laisseriez votre couche de rapport (SSRS par exemple) gérer le pivotement, pour lequel il est bien mieux adapté que le SQL pur.