sql >> Database >  >> RDS >> Sqlserver

Kruistabelquery met dynamische kolommen in SQL Server 2008

De vraag die u nodig heeft om de resultaten in uw vraag te krijgen, is:

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;

Uitgang:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Hoewel je misschien kunt achterhalen, vereist dit een harde codering van de onderwerpen. Als uw lijst met onderwerpen waarschijnlijk zal veranderen, is deze zoekopdracht niet langer geschikt voor het beoogde doel.

Als u vertrouwd bent, kunt u dit verhelpen met dynamische 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);

In het ideale geval zou u echter gewoon een set gegevens retourneren, zoals deze in uw brontabel lijkt te staan, en uw rapportagelaag (SSRS bijvoorbeeld) het draaien laten afhandelen, waarvoor het veel beter geschikt is dan pure SQL.



  1. UNNEST gebruiken met een JOIN

  2. Rails:toestemming geweigerd voor relatie schema_migrations

  3. Apache Olinge OData-service genereert EdmSimpleTypeException wanneer de kolom in de database van het type TEXT of BLOB is

  4. MySql:Tel het aantal keren dat de woorden in een kolom voorkomen