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

Affichage croisé dans mySQL ?

Ce type de transformation de données est appelé PIVOT. MySQL n'a pas de fonction pivot mais vous pouvez utiliser une fonction d'agrégation avec un CASE expression pour obtenir le résultat.

Si les noms des clients est connue à l'avance, vous pouvez coder en dur la requête :

select s.playdate,
  sum(case when clname = 'Chris' then score end) Chris,
  sum(case when clname = 'Gale' then score end) Gale,
  sum(case when clname = 'Donna' then score end) Donna
from clients c
inner join scores s
  on c.clid = s.clid
group by s.playdate;

Voir SQL Fiddle avec démo .

Si vous avez un nombre inconnu de clients ou si vous allez ajouter de nouveaux clients que vous souhaitez inclure sans avoir à modifier le code, vous pouvez utiliser une instruction préparée pour générer du SQL dynamique :

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(CASE WHEN clName = ''',
      clName,
      ''' THEN score else ''-'' END) AS `',
      clName, '`'
    )
  ) INTO @sql
FROM clients;

SET @sql 
  = CONCAT('SELECT s.playdate, ', @sql, ' 
            from clients c
            inner join scores s
              on c.clid = s.clid
            group by s.playdate');

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

Voir SQL Fiddle avec démo . Les deux requêtes donneront le même résultat.