Denna typ av datatransformation kallas en PIVOT. MySQL har ingen pivotfunktion men du kan använda en aggregatfunktion med en CASE
uttryck för att få resultatet.
Om namnen på clients
är känd i förväg kan du hårdkoda frågan:
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;
Se SQL-fiol med demo .
Om du har ett okänt antal klienter eller om du kommer att lägga till nya klienter som du vill ha inkluderade utan att behöva ändra koden, kan du använda en förberedd sats för att generera dynamisk SQL:
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;
Se SQL-fiol med demo . Båda frågorna ger samma resultat.