Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Exibição de tabela cruzada no mySQL?


Esse tipo de transformação de dados é chamado de PIVOT. O MySQL não tem uma função pivô, mas você pode usar uma função agregada com um CASE expressão para obter o resultado.

Se os nomes dos clients é conhecido com antecedência, então você pode codificar a 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 with Demo .

Se você tiver um número desconhecido de clientes ou estiver adicionando novos clientes que deseja incluir sem precisar alterar o código, poderá usar uma instrução preparada para gerar 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 with Demo . Ambas as consultas darão o mesmo resultado.