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

¿Vista de tabulación cruzada en mySQL?

Este tipo de transformación de datos se llama PIVOT. MySQL no tiene una función pivote, pero puede usar una función agregada con un CASE expresión para obtener el resultado.

Si los nombres de los clients se conoce con anticipación, entonces puede codificar la consulta:

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;

Consulte SQL Fiddle con demostración .

Si tiene un número desconocido de clientes o agregará nuevos clientes que querrá incluir sin tener que cambiar el código, entonces puede usar una declaración preparada para generar SQL dinámico:

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;

Consulte SQL Fiddle con demostración . Ambas consultas darán el mismo resultado.