web-dev-qa-db-ja.com

行を列MySQLにピボットする方法

ピボット行(progress_check)を列check 1、check 2などにピボットしています...結果を表示するためだけに合計や合計は必要ありません...誰か助けてくれてありがとうAd

This is the table (grades) in MYSQL

Hope to get something like this!

9
Adam

これは、標準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、件名...すべての利用可能な情報のデカルト積が結果に表示されます。情報は失われませんが、要約もされません。この動作が望ましいかどうかは、ユースケースによって異なります。

4
joanolo

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)  

デモを見る http://sqlfiddle.com/#!9/0be1f2/1

6
Raymond Nijland