sql >> データベース >  >> RDS >> Sqlserver

SQLで行を列に変換する

    PIVOT 次のように、これらのコースの成績の行を列に変換するテーブル演算子:

    SELECT  
      Course, 
      [1] AS "Grade 1", 
      [2] AS "Grade 2", 
      [3] AS "Grade 3", 
      [4] AS "Grade 4"
    FROM
    (
      SELECT 
        Course, 
        Grade, 
        ROW_NUMBER() OVER(PARTITION BY Course 
                          ORDER BY COURSE) rownum 
      FROM Grades
    ) t
    PIVOT 
    (
       MAX(Grade)
       FOR rownum IN([1], [2], [3], [4])
    ) p;
    

    SQLフィドルデモ

    これにより、次のことが可能になります:

    COURSE    GRADE 1   GRADE 2      GRADE 3     GRADE 4
      A         15        17          (null)     (null)
      B         12      (null)        (null)     (null)
      C         10        18            0           9
    

    注意: ランキング関数 ROW_NUMBER()> PARTITIONBYコース それらを4つのグレードに分割します。次に、それらをこれらの4つのグループにグループ化できるようにします。

    これを動的に行う必要がある場合は、グレード数が不明な場合に備えて。この場合、動的SQLを使用して、次のように動的に成績のリストを生成できます。

    DECLARE @cols AS NVARCHAR(MAX);
    DECLARE @query AS NVARCHAR(MAX);
    
    SELECT @cols = STUFF((SELECT distinct ',' 
                            + QUOTENAME('Grade ' 
                            + CAST(ROW_NUMBER() OVER(PARTITION BY Course 
                                                   ORDER BY Course) AS VARCHAR(10)))
                    FROM Grades
                             FOR XML PATH(''), TYPE
                          ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
    
    SELECT @query = 'SELECT Course, ' + @cols +  
                    'FROM
                     (
                       SELECT 
                         Course, 
                         Grade, 
                         ''Grade '' + CAST(ROW_NUMBER() 
                                           OVER(PARTITION BY Course 
                                    ORDER BY COURSE) AS VARCHAR(10)) rownum 
                       FROM Grades
                     ) t
                     PIVOT 
                     (
                       MAX(Grade)
                       FOR rownum IN(' + @cols + ')' +
                    ') p';
    execute(@query);
    

    動的SQLフィドルデモ




    1. 主キーを整数からシリアルに変換する方法は?

    2. simpleJdbcCallがPl/SQLプロシージャを呼び出しています-ORA-22922存在しないLOB値

    3. MySQLを使用してUnixタイムスタンプを人間が読める形式の日付に変換する

    4. ProgrammingError:文字列のフォーマット中にすべての引数が変換されたわけではありません