Saltar al contenido

Cómo pivotar filas en columnas MySQL

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *