2016-06-22 22 views
0

Ich habe eine Tabelle wie soPivot Zeilen in Spalten basierend auf Zustand

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 

möchte ich es wie dieses ist

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

das Konzept der Dreh arrangieren

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; 

die Ich kann in meinem Fall nicht wirklich herausfinden, wie ich die Spalten s1 - s4 nach Vorkommen erstelle, dh die erste Punktzahl für jeden Schüler wird s1, Sekunde wird s2 usw.

, wie ich diese

Antwort

3

Die einfachste Methode ist es, die Werte in einer einzigen Spalte setzen lösen:

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

, die für viele Zwecke ausreichend ist. Wenn Sie separate Spalten benötigen, müssen Sie eine Spalte erstellen. Eine Möglichkeit, verwendet Variablen:

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

danken Ihnen sehr, wie stelle ich ein Bindestrich (-), wenn es keine Punktzahl ist – Smith

+0

@Smith. . . Das ist härter als es scheint. 'score' ist - vermutlich - eine Zahl und ein Strich ist eine Zeichenkette. Sie müssen also mit Tippfehlern umgehen. Diese Art der Transformation wird oft in der Anwendungsschicht durchgeführt. –

Verwandte Themen