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

MySQLクエリの転置-行を列に変換する必要があります

    PIVOTを実行する必要があります (他のRDBMSとは異なり)MySQLではネイティブにサポートされていない操作。

    最も近い方法は、次の行に沿ってSQLを作成することです。

    SELECT   ProductId,
             GROUP_CONCAT(IF(Name='Brand Name'          ,value,NULL))
               AS `Brand Name`,
             GROUP_CONCAT(IF(Name='Ethernet Technology' ,value,NULL))
               AS `Ethernet Technology`,
             GROUP_CONCAT(IF(Name='Form Factor'         ,value,NULL))
               AS `Form Factor`,
             GROUP_CONCAT(IF(Name='Media Type Supported',value,NULL))
               AS `Media Type Supported`
    FROM     search_export
    GROUP BY ProductId
    

    可能であればName 値は動的であるため、次の結果から高級言語でこのようなSQLを生成できます。

    SELECT DISTINCT Name FROM search_export
    

    実際、SQL自体を使用することもできます:

    SELECT CONCAT('
             SELECT   ProductId, ',
           GROUP_CONCAT('
                      GROUP_CONCAT(IF(Name=',QUOTE(Name),',value,NULL))
                        AS `',REPLACE(Name,'`','``'),'`'
           ), '
             FROM     search_export
             GROUP BY ProductId
           ')
    INTO @sql
    FROM (
      SELECT DISTINCT Name FROM search_export
    ) t;
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    異なるNameがたくさんある場合は注意してください 値を増やす必要がある場合は、 group_concat_max_len デフォルトの1KiBから。




    1. データベースをアップグレードするときに楽しむ5つの利点

    2. カレンダーイベントの繰り返しといくつかの最終的な計算

    3. 指定されたIDの最新の行を取得します

    4. SQLServerで特定の文字のASCIIコード値を返す方法