Mysql
 sql >> Database >  >> RDS >> Mysql

Visualizzazione a campi incrociati in MySQL?

Questo tipo di trasformazione dei dati è chiamato PIVOT. MySQL non ha una funzione pivot ma puoi usare una funzione aggregata con un CASE espressione per ottenere il risultato.

Se i nomi dei clients è noto in anticipo, quindi puoi codificare la query:

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;

Vedi SQL Fiddle con demo .

Se hai un numero sconosciuto di client o aggiungerai nuovi client che vorrai includere senza dover modificare il codice, puoi utilizzare un'istruzione preparata per generare SQL dinamico:

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;

Vedi SQL Fiddle con demo . Entrambe le query daranno lo stesso risultato.