MySQLにはピボット関数はありませんが、CASE
式を含む集計関数を使用して複製できます。コードは次のようになります。
select s.id,
s.name,
max(case when week=1 then control else 'A' end) Week1,
max(case when week=3 then control else 'A' end) Week3,
max(case when week=9 then control else 'A' end) Week9
from students s
inner join attendance a
on s.id = a.student
group by s.id, s.name
SQL FiddlewithDemoを参照してください
返す値の数が不明な場合week
は、プリペアドステートメントで動的SQLを使用する必要があります。コードは次のようになります。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(CASE WHEN week = ',
week,
' THEN control else ''A'' END) AS week',
week
)
) INTO @sql
FROM weeks;
SET @sql
= CONCAT('SELECT s.id,
s.name, ', @sql, '
from students s
inner join attendance a
on s.id = a.student
group by s.id, s.name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SQL FiddlewithDemoを参照してください
結果は次のようになります。
| ID | NAME | WEEK1 | WEEK3 | WEEK6 | WEEK8 | WEEK9 | WEEK12 |
-----------------------------------------------------------------
| 1 | Charles | P | P | A | A | A | A |
| 2 | Peter | A | A | A | A | A | A |
| 3 | Mary | A | A | A | A | P | A |
Students
注:テーブルに一致する行があるかどうかに関係なく、テーブル内のすべてを返したい場合は、 :attendance
を使用する必要があります。LEFT JOIN
select s.id,
s.name,
max(case when week=1 then control else 'A' end) Week1,
max(case when week=3 then control else 'A' end) Week3,
max(case when week=9 then control else 'A' end) Week9
from students s
left join attendance a
on s.id = a.student
group by s.id, s.name
SQL FiddlewithDemoを参照してください。