2016-10-04 3 views
2

내가 3 개 테이블이 있다고 가정하고, 나는부분 피봇 팅

Class 
id: integer 
name: string 

Student 
id: integer 
name: string 
class_id: integer //Foreign key to Class table 

또한
Score 
id: integer 
student_id: integer //Foreign key to Student table 
subject: string //String enum of "Math", "Physics", "Chemistry" 
score: float 

, 가정 모든 DDL을 변경할 수 없습니다 문자열 열거 형은 항상 올바른 것으로 세 가지 가능한 값 중 하나만 채워집니다.

그리고이 같은 결과 쿼리가 필요 student_id | student_name | class_name | math | physics | chemistry 수학 필드는 "수학"피사체의 평균 점수입니다 는 물리학 필드는 "물리학"대상의 평균 점수이며, 화학 필드는 "화학의 평균 점수입니다 "학생 ID가 학생 ID입니다.

내가 레일 ActiveRecord::Base에서 처리 할 수 ​​있다는 것을 알고 있지만 include를 사용하더라도 많은 쿼리를 사용하게됩니다.

하나의 쿼리 만 사용하여 필요한 출력을 생성하려면 어떻게해야합니까? 당신은이 작업을 수행 할 수 있습니다

답변

3

조인 및 집계 :

select s.student_id, s.student_name, c.class_name, 
     avg(case when sc.subject = 'Math' then sc.score end) as Math, 
     avg(case when sc.subject = 'Physics' then sc.score end) as Physics, 
     avg(case when sc.subject = 'Chemistry' then sc.score end) as Chemistry 
from students s join 
    scores sc 
    on sc.student_id = s.id join 
    classes c 
    on sc.class_id = cl.id 
group by s.student_id, s.student_name, c.class_name;