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

Sélectionnez les colonnes dynamiques dans mysql

Malheureusement MySQL n'a pas de PIVOT fonction qui est essentiellement ce que vous essayez de faire. Vous devrez donc utiliser une fonction d'agrégation avec un CASE déclaration :

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

Voir SQL Fiddle avec démo

Maintenant, si vous souhaitez effectuer cela de manière dynamique, c'est-à-dire que vous ne savez pas à l'avance les colonnes à transposer, alors vous devriez consulter l'article suivant :

Tableaux croisés dynamiques (transformer les lignes en colonnes)

Votre code ressemblerait à ceci :

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;

Voir SQL Fiddle avec démo