Je cherchais à faire pivoter les lignes (progress_check) dans les colonnes, vérifiez 1, vérifiez 2, etc.
C'est une façon de pivot
d'utiliser le SQL standard (et la partie du standard que MySQL implémente). Cela signifie qu'il fonctionne non seulement dans MySQL, mais aussi dans la plupart des bases de données 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 ;
Vérifiez-le sur SQLFiddle
Bien que pour ce genre de problèmes (sims_id, subject-id, progress_check)
devrait être un PRIMARY KEY
(ou, au moins, UNIQUE
), en utilisant cette méthode, il y a des valeurs répétées pour "C1", "C2 "ou" C3 "pour un seul sims_id, sous réserve ... le produit cartésien de toutes les informations disponibles apparaît dans le résultat. Aucune information n'est perdue, mais elle n'est pas non plus résumée. Que ce comportement soit souhaitable ou non dépend du cas d'utilisation.
GROUP BY et en utilisant MAX ou SUM est la méthode de pivot standard la plus utilisée.
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
Résultat
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)
voir la démo http://sqlfiddle.com/#!9/0be1f2/1