2016-06-22 213 views
0

我有一個表像這樣樞行列基於條件

id student_id score 
1 1   45 
2 2   55 
3 2   75 
4 3   80 
5 1   90 
6 2   78 
7 3   55 
8 1   45 
9 1   65 

我想這樣

student_id s1 s2 s3 s4 
1   45 90 45 65 
2   55 75 78 - 
3   80 55 - - 

樞紐的概念來安排它是

SELECT 
    item_id, 
    MAX(IF(property_name = 'property_value1', value, NULL)) AS alias1, 
    MAX(IF(property_name = 'property_value2', value, NULL)) AS alias2, 
    ... 
    ... 
    ... 
FROM 
    table 
GROUP BY 
    item_id; 

這我無法真正瞭解我的情況,因爲我正在創建s1 - s4列,即每個學生的第一個分數變爲s1,第二個成爲S2等

我如何解決這個

回答

3

最簡單的方法是將值一列:

select student_id, group_concat(score order by id) 
from t 
group by student_id; 

足以用於多種用途。如果你想分開的列,你需要創建一個列。一種方法是使用變量:

select student_id, 
     max(case when rn = 1 then score end) as score_1, 
     max(case when rn = 2 then score end) as score_2, 
     max(case when rn = 3 then score end) as score_3, 
     max(case when rn = 4 then score end) as score_4 
from (select t.*, 
      (@rn := if(@s = student_id, @rn + 1, 
         if(@s := student_id, 1, 1) 
         ) 
      ) as rn 
     from t cross join 
      (select @s := -1, @rn := 0) params 
     order by student_id, id 
    ) t 
group by student_id; 
+0

非常感謝你,我怎麼把一個破折號( - )時,有沒有得分 – Smith

+0

@Smith。 。 。這比看起來更難。 'score'是 - 大概 - 一個數字,短劃線是一個字符串。所以你必須處理打字問題。這種轉換通常是在應用程序層完成的。 –