Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Кръстосана заявка с динамични колони в SQL Server 2008

Заявката, от която ще се нуждаете, за да получите резултатите във вашия въпрос, е:

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;

Изход:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

Въпреки че, както може да сте в състояние да разберете, това изисква твърдо кодиране на темите. Ако списъкът ви с теми има вероятност да се промени, тогава тази заявка вече няма да отговаря на целта.

Ако ви е удобно, можете да поправите това с динамичен 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);

В идеалния случай обаче бихте могли просто да върнете набор от данни, както изглежда във вашата изходна таблица, и да оставите вашия отчетен слой (SSRS например) да се справи с обръщането, за което е много по-подходящ от чистия 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. Внедряване на общ индикатор за производителност на MS SQL Server

  2. Неуспешно преобразуване при преобразуване на стойността на varchar „няма“ към тип данни int

  3. Лесен начин за транспониране на колони и редове в SQL?

  4. Бройте въз основа на условие в SQL Server

  5. SqlServer:Неуспешно влизане за потребител