sql >> Base de Datos >  >> RDS >> Mysql

Transponer consulta MySQL:necesita filas en columnas

Necesitas realizar un PIVOT operación, que no se admite de forma nativa en MySQL (a diferencia de otros RDBMS).

Lo más cercano que puede obtener es construir SQL a lo largo de las siguientes líneas:

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 el posible Name los valores son dinámicos, podría generar dicho SQL en un lenguaje de nivel superior a partir de los resultados de:

SELECT DISTINCT Name FROM search_export

De hecho, uno podría incluso usar el propio 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;

Tenga en cuenta que si hay muchos Name diferentes valores, es posible que deba aumentar group_concat_max_len de su valor predeterminado de 1 KiB.