web-dev-qa-db-fra.com

Comment faire pivoter des lignes dans des colonnes MySQL

Je cherchais à faire pivoter les lignes (progress_check) dans les colonnes, vérifiez 1, vérifiez 2, etc.

This is the table (grades) in MYSQL

Hope to get something like this!

9
Adam

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.

4
joanolo

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

6
Raymond Nijland