このタイプのデータ変換は、PIVOTと呼ばれます。 MySQLにはピボット関数はありませんが、CASE
で集計関数を使用できます。 結果を得るための式。
clients
の名前の場合 が事前にわかっている場合は、クエリをハードコーディングできます:
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;
SQL Fiddle withDemo を参照してください。 。
クライアントの数が不明な場合、またはコードを変更せずに含めたい新しいクライアントを追加する場合は、プリペアドステートメントを使用して動的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;
SQL Fiddle withDemo を参照してください。 。どちらのクエリでも同じ結果が得られます。