sql >> Databáze >  >> RDS >> Sqlserver

Křížový dotaz s dynamickými sloupci v SQL Server 2008

Dotaz, který budete potřebovat k získání výsledků ve své otázce, je:

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;

Výstup:

StudentID   Name    Computing   Maths   English
1           John    L2          E3      E2

I když, jak můžete zjistit, to vyžaduje tvrdé kódování předmětů. Pokud se váš seznam předmětů pravděpodobně změní, pak tento dotaz již nebude vyhovovat účelu.

Pokud vám to vyhovuje, můžete to napravit pomocí dynamického 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);

V ideálním případě byste však jednoduše vrátili sadu dat, jak se zdá ve vaší zdrojové tabulce, a nechali vaši vrstvu sestav (například SSRS) zvládnout pivotování, ke kterému se hodí mnohem lépe než čistý SQL.



  1. Jak zjistím, kdy byla tabulka MySQL naposledy aktualizována?

  2. Kontrola číselného ověření

  3. Mohu použít stream k VLOŽENÍ nebo AKTUALIZACI řádku na serveru SQL Server (C#)?

  4. Jak poznáte, že potřebujete samostatné tabulky?