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.