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

行を列に動的に変換するMysqlクエリ

    GROUP BYを使用できます およびMAX ピボットをシミュレートします。 MySQLはIFもサポートしています ステートメント。

    SELECT  ID,
            MAX(IF(`order` = 1, data, NULL)) data1,
            MAX(IF(`order` = 2, data, NULL)) data2
    FROM    TableA
    GROUP   BY ID
    

    orderの値が複数ある場合 、クエリを変更する必要がないように、動的SQLの方が適切な場合があります:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'MAX(IF(`order` = ', `order`, ',data,NULL)) AS data', `order`)
      ) INTO @sql
    FROM TableName;
    
    SET @sql = CONCAT('SELECT  ID, ', @sql, ' 
                      FROM    TableName
                      GROUP   BY ID');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    両方のクエリの出力:

    ╔════╦═══════╦═══════╗
    ║ ID ║ DATA1 ║ DATA2 ║
    ╠════╬═══════╬═══════╣
    ║  1 ║ P     ║ S     ║
    ║  2 ║ R     ║ Q     ║
    ╚════╩═══════╩═══════╝
    


    1. SQLiteEXCEPT演算子

    2. DATE()の例– MySQL

    3. OracleCloudおよびAutonomousDatabaseでの無料認定試験の新しい日付

    4. MySQLエラー1215:外部キー制約を追加できません