Mysql
 sql >> Base de données >  >> RDS >> Mysql

Transposer la requête MySQL - besoin de lignes en colonnes

Vous devez effectuer un PIVOT opération, qui n'est pas prise en charge nativement dans MySQL (contrairement à certains autres SGBDR).

Le plus proche que vous pouvez obtenir est de construire SQL selon les lignes suivantes :

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

Si possible Name les valeurs sont dynamiques, vous pouvez générer un tel SQL dans un langage de niveau supérieur à partir des résultats de :

SELECT DISTINCT Name FROM search_export

En effet, on pourrait même utiliser SQL lui-même :

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;

Notez que s'il y a beaucoup de Name différents valeurs, vous devrez peut-être augmenter group_concat_max_len de sa valeur par défaut de 1 Ko.