sql >> Databasteknik >  >> RDS >> Sqlserver

Korstabellfråga med dynamiska kolumner i SQL Server 2008

Frågan du behöver för att få resultaten i din fråga är:

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;

Utdata:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Även om du kanske kan träna kräver detta hård kodning av ämnena. Om din lista över ämnen sannolikt kommer att ändras, kommer den här frågan inte längre att passa för ändamålet.

Om du är bekväm kan du åtgärda detta 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);

Helst skulle du dock helt enkelt returnera en uppsättning data, som den verkar finnas i din källtabell och låta ditt rapportlager (till exempel SSRS) hantera pivoteringen, vilket det är mycket bättre lämpat för än ren SQL.



  1. Automatiskt genererat sekvensnummer från 001 (ENDAST FÖR 3 SIFFROR) - PHP / MYSQL

  2. MySQL IF/CASE-syntax som anropar olika SELECT-satser

  3. Fel vid körning av python manage.py syncdb lokalt, men inget fel vid körning av samma kommando via Heroku

  4. Automatisk ökning av tabellkolumnen