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

Krydstabuleringsforespørgsel med dynamiske kolonner i SQL Server 2008

Den forespørgsel, du skal bruge for at få resultaterne i dit spørgsmål, er:

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;

Output:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Selvom du måske kan træne, kræver dette hård kodning af fagene. Hvis din liste over emner sandsynligvis vil ændre sig, vil denne forespørgsel ikke længere være egnet til formålet.

Hvis du er tryg, kan du afhjælpe dette med dynamisk SQL:

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

Ideelt set ville du dog blot returnere et sæt data, som det ser ud til at være i din kildetabel, og lade dit rapporteringslag (f.eks. SSRS) håndtere pivoteringen, som den er meget bedre egnet til end ren SQL.



  1. Vælg på værdiændring

  2. Sådan trimmes de første tre tegn baseret på det første bogstav (udtryk), før det indsættes i databasen

  3. SqlCommand sikkerhedskopiere database

  4. sqlalchemy:rækkefølgen af ​​forespørgselsresultatet uventet