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. 「選択」は常に主キーで並べ替えられますか?

    2. MySQLルートパスワードを回復する

    3. QoQを実行した後、目的の出力が得られない

    4. GlassFishサーバーのasadminツールを使用してmysql接続プールを作成するにはどうすればよいですか?