Jenis transformasi data ini disebut PIVOT. MySQL tidak memiliki fungsi pivot tetapi Anda dapat menggunakan fungsi agregat dengan CASE
ekspresi untuk mendapatkan hasilnya.
Jika nama clients
diketahui sebelumnya, maka Anda dapat membuat hard-code kueri:
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;
Lihat SQL Fiddle dengan Demo .
Jika Anda memiliki jumlah klien yang tidak diketahui atau Anda akan menambahkan klien baru yang ingin Anda sertakan tanpa harus mengubah kode, maka Anda dapat menggunakan pernyataan yang disiapkan untuk menghasilkan SQL dinamis:
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;
Lihat SQL Fiddle dengan Demo . Kedua query akan memberikan hasil yang sama.