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

mysqlでの行から列への変換

    このタイプのデータ変換は、ピボットとして知られています。 。 MySQLにはピボット関数がないため、CASEを使用した集計関数を使用してデータを変換する必要があります。 表現。

    変換する値が事前にわかっている場合は、次のように値をハードコーディングできます。

    select studentid,
      sum(case when subject = 'Java' then mark else 0 end) Java,
      sum(case when subject = 'C#' then mark else 0 end) `C#`,
      sum(case when subject = 'JavaScript' then mark else 0 end) JavaScript
    from yourtable
    group by studentid
    

    SQL Fiddle withDemo を参照してください。 。

    サブジェクトの値が不明または柔軟な場合は、プリペアドステートメントを使用して動的SQLを生成することをお勧めします。

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'sum(case when subject = ''',
          subject,
          ''' then mark else 0 end) AS `',
          subject, '`'
        )
      ) INTO @sql
    FROM  yourtable;
    
    SET @sql = CONCAT('SELECT studentid, ', @sql, ' 
                      from yourtable
                      group by studentid');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    SQL Fiddle withDemo を参照してください。 。

    両方のクエリの結果は次のとおりです。

    | STUDENTID | JAVA | C# | JAVASCRIPT |
    --------------------------------------
    |        10 |   46 | 65 |         79 |
    |        11 |   66 | 85 |         99 |
    



    1. .NET DateTimeミリ秒を丸めて、SQLServerミリ秒に適合できるようにします

    2. SQLServerで主キーなしですべてのテーブルを返す3つの方法

    3. java.sql.SQLException:jdbc:mysql:// localhost:3306/dbnameに適したドライバーが見つかりません

    4. 警告:mysqli_connect():(HY000 / 1045):ユーザー'root' @'localhost'のアクセスが拒否されました(パスワードを使用:NO)