Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie krzyżowe z dynamicznymi kolumnami w SQL Server 2008

Zapytanie potrzebne do uzyskania wyników w pytaniu to:

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;

Wyjście:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Chociaż możesz być w stanie poćwiczyć, wymaga to trudnego kodowania tematów. Jeśli Twoja lista tematów prawdopodobnie ulegnie zmianie, to zapytanie nie będzie już pasować do celu.

Jeśli czujesz się komfortowo, możesz temu zaradzić za pomocą dynamicznego 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);

Idealnie byłoby jednak, gdybyś po prostu zwrócił zestaw danych, tak jak wydaje się, że znajduje się w tabeli źródłowej, a warstwa raportowania (na przykład SSRS) zajmie się przestawianiem, do którego jest znacznie lepiej przystosowana niż czysty SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać najlepiej opłacany wiersz pracownika

  2. Kolumna niepoprawna na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej, ani w klauzuli GROUP BY

  3. Wykonywanie różnych podejść do danych opartych na czasie

  4. Jak uzyskać listę wszystkich języków w SQL Server (T-SQL)

  5. Eksplorowanie interfejsu graficznego magazynu zapytań SQL Server 2016