Basta ya de indagar por todo internet porque has llegado al espacio exacto, tenemos la solución que buscas y sin complicarte.
Solución:
GROUP BY y usar MAX o SUM es la forma de pivote estándar más utilizada.
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
Resultado
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)
ver demostración http://sqlfiddle.com/#!9/0be1f2/1
Esta es una forma de pivot
utilizando SQL estándar (y la parte del estándar que implementa MySQL). Eso significa que no solo funciona en MySQL, sino también en la mayoría de las bases de datos 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 ;
Compruébalo en SQLFiddle
Aunque para este tipo de problemas (sims_id, subject-id, progress_check)
debería ser un PRIMARY KEY
(o al menos, UNIQUE
), usando este método, si hay repetido valores para “C1”, “C2” o “C3” para un solo sims_id, sujeto… el producto cartesiano de toda la información disponible aparece en el resultado. No se pierde información, pero tampoco se resume. Si este comportamiento es deseable o no depende del caso de uso.