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

Requête SQL pour reconstruire une table en utilisant ses données de ligne dynamiques pour les noms de colonne

Il s'agit essentiellement d'un PIVOT mais MySQL n'a pas de fonction PIVOT. Vous voudrez donc reproduire cela en utilisant une fonction d'agrégation et un CASE déclaration. Si vous connaissez le nombre de Grant valeurs que vous avez, vous pouvez coder en dur la requête comme ceci :

select 
  Month,
  sum(case when `grant`='DOE' then subtotal else 0 end) DOE,
  sum(case when `grant`='Hatch' then subtotal else 0 end) Hatch,
  sum(case when `grant`='NIH' then subtotal else 0 end) NIH,
  sum(case when `grant`='NSF' then subtotal else 0 end) NSF,
  sum(case when `grant`='Other' then subtotal else 0 end) Other,
  sum(case when `grant`='State' then subtotal else 0 end) State
from yourtable
group by month

Voir SQL Fiddle avec démo

Maintenant, si vous avez un nombre inconnu de valeurs pour Grant , vous pouvez alors utiliser une instruction préparée pour générer une version dynamique de cette requête :

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when `Grant` = ''',
      `Grant`,
      ''' then Subtotal else 0 end) AS `',
      `Grant`, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql = CONCAT('SELECT month, ', @sql, ' 
                  FROM yourtable 
                  group by month');


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

Voir SQL Fiddle avec démo

Les deux produisent le même résultat :

|    MONTH |  HATCH |   NIH |    NSF |  OTHER |    DOE |  STATE |
-----------------------------------------------------------------
| Nov-2012 | 144.56 | 240.9 |  100.7 | 276.67 |      0 |      0 |
| Oct-2012 | 321.54 |     0 | 234.53 | 312.35 | 214.35 |      0 |
| Sep-2012 | 147.99 |     0 | 156.89 | 245.67 |      0 | 148.66 |