Скажем, у меня есть отношение grades
к оценкам учащихся, например:
| ID | semester | Year | course_id | grade |
|------+----------+------+-----------+-------+
| 1018 | Fall | 2002 | 272 | A+ |
| 107 | Fall | 2002 | 274 | B |
| 111 | Fall | 2002 | 123 | C |
/* a lot of data here */
|------+----------+------+-----------+-------+------------|
Я хочу группировать по course_id
и считать их оценки следующим образом:
| course_id | semester | year | A+ | A- | B+ | B- | C+ | D+ | D- | else | sum |
| 1 | Fall | 2009 | 11 | 8 | 10 | 1 | 1 | 1 | 1 | 1 | 34 |
| 2 | Fall | 2009 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 8 |
Я уже нашел одно решение, но мне кажется, что оно меня не устраивает:
/* use sum function */
select course_id, semester, year,
sum(if(grade = 'A+', 1, 0)) as 'A+',
sum(if(grade = 'A-', 1, 0)) as 'A-',
/* multiple lines */
from grades
group by course_id, semester, year;
Интересно, есть ли еще встроенный способ сделать это, потому что мое решение вроде какхитрый и не общий.
Может кто-нибудь предложить лучшую идею?
ps: да, это школьное задание, и я хочу искать больше решений :) Буду признателен, если дадите мне больше советов.