sql >> Base de Datos >  >> RDS >> Sqlserver

Consulta de tabulación cruzada con columnas dinámicas en SQL Server 2008

La consulta que necesitará para obtener los resultados de su pregunta es:

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;

Salida:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Aunque, como es posible que pueda resolver, esto requiere una codificación estricta de los temas. Si es probable que su lista de temas cambie, entonces esta consulta ya no será adecuada para su propósito.

Si se siente cómodo, puede remediarlo con SQL dinámico:

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

Sin embargo, idealmente, simplemente devolvería un conjunto de datos, como parece estar en su tabla de origen y dejaría que su capa de informes (por ejemplo, SSRS) maneje el pivote, para lo cual es mucho más adecuado que SQL puro.