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

Seleccionar columnas dinámicas en mysql

Desafortunadamente, MySQL no tiene un PIVOT función que es básicamente lo que está tratando de hacer. Por lo tanto, deberá usar una función agregada con un CASE declaración:

SELECT type,
  sum(case when criteria_id = 'env' then result end) env,
  sum(case when criteria_id = 'gas' then result end) gas,
  sum(case when criteria_id = 'age' then result end) age
FROM results
group by type

Consulte SQL Fiddle con demostración

Ahora bien, si desea realizar esto dinámicamente, lo que significa que no sabe de antemano qué columnas transponer, debe revisar el siguiente artículo:

Tablas dinámicas dinámicas (transformar filas en columnas)

Su código se vería así:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(IF(CRITERIA_ID = ''',
      CRITERIA_ID,
      ''', RESULT, NULL)) AS ',
      CRITERIA_ID
    )
  ) INTO @sql
FROM
  Results;
SET @sql = CONCAT('SELECT type, ', @sql, ' FROM Results GROUP BY type');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Consulte SQL Fiddle con demostración