これは、標準SQL(およびMySQLが実装する標準の一部)を使用してpivot
を実行する1つの方法です。つまり、MySQLだけでなく、ほとんどのSQLデータベースでも機能します。
SELECT
r0.sims_id,
r0.subject,
r1.result AS "C1",
r2.result AS "C2",
r3.result AS "C3"
FROM
(SELECT DISTINCT
sims_id, subject
FROM
results
) r0
LEFT JOIN results r1
ON r1.sims_id = r0.sims_id AND r1.subject = r0.subject AND r1.progress_check = 'C1'
LEFT JOIN results r2
ON r2.sims_id = r0.sims_id AND r2.subject = r0.subject AND r2.progress_check = 'C2'
LEFT JOIN results r3
ON r3.sims_id = r0.sims_id AND r3.subject = r0.subject AND r3.progress_check = 'C3'
ORDER BY
r0.sims_id, r0.subject ;
SQLFiddle で確認してください
この種の問題については(sims_id, subject-id, progress_check)
はPRIMARY KEY
(または、少なくともUNIQUE
)、このメソッドを使用すると、 "C1"、 "C2のrepeated値があります"または" C3 "1つのsims_id、件名...すべての利用可能な情報のデカルト積が結果に表示されます。情報は失われませんが、要約もされません。この動作が望ましいかどうかは、ユースケースによって異なります。
GROUP BYおよびMAXまたはSUMの使用は、最もよく使用される標準ピボット方式です。
SELECT
results.sims_id
, results.subject
, MAX(CASE WHEN results.progress_check = "C1" THEN results.result END) "C1"
, MAX(CASE WHEN results.progress_check = "C2" THEN results.result END) "C2"
, MAX(CASE WHEN results.progress_check = "C3" THEN results.result END) "C3"
FROM
results
GROUP BY
results.sims_id
, results.subject
ORDER BY
results.sims_id ASC
, results.subject ASC
結果
sims_id subject C1 C2 C3
------- ------- ------ ------ --------
1111 Art C B (NULL)
1111 English 6 5 (NULL)
1111 History B C (NULL)
1111 maths 8 8 (NULL)
1111 science A B (NULL)
2222 Art (NULL) A (NULL)
2222 English 6 (NULL)
2222 ICT A B (NULL)
2222 maths 7 6 (NULL)
2222 science A A* (NULL)