Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kreuztabellenansicht in mySQL?

Diese Art der Datentransformation wird als PIVOT bezeichnet. MySQL hat keine Pivot-Funktion, aber Sie können eine Aggregatfunktion mit einem CASE verwenden Ausdruck, um das Ergebnis zu erhalten.

Wenn die Namen der clients im Voraus bekannt ist, können Sie die Abfrage fest codieren:

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;

Siehe SQL Fiddle mit Demo .

Wenn Sie eine unbekannte Anzahl von Clients haben oder neue Clients hinzufügen möchten, ohne den Code ändern zu müssen, können Sie eine vorbereitete Anweisung verwenden, um dynamisches SQL zu generieren:

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;

Siehe SQL-Fiddle mit Demo . Beide Abfragen liefern das gleiche Ergebnis.