2016-10-04 1 views
2

Предположим, у меня есть 3 таблицы, и я не могу изменить любой DDLЧастичное Pivoting в PostgreSQL или Rails

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 

Кроме того, предположим, что строка перечисления всегда будет исправлена, заполненной только одним из трех возможных значений.

И мне нужен полученный запрос, как это student_id | student_name | class_name | math | physics | chemistry где математика поле средний балл по предмету «Математика», физика поле средний балл «Физика» и химия поле средний балл «Химии "субъект студента с id student_id.

Я знаю, что могу обрабатывать его в Rails 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;