Скажем, у меня есть grades
относительно 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: да, это школьное задание, и я хочу искать больше решений :) Понятно, дайте мне больше советов.
Нет более простого способа сделать это. На самом деле, я бы упростил логику (при условии, что MySQL):
select course_id, semester, year,
sum( grade = 'A+') as 'A+',
sum(i grade = 'A-') as 'A-',
/* multiple lines */
from grades
group by course_id, semester, year;
Однако это, вероятно, не то, что вы ищете. SQL-запрос возвращает набор исправлений столбцов с фиксированными именами и типами. Если вы хотите, чтобы столбцы были основаны на фактических значениях, вы не можете легко использовать простой оператор SQL.
Вы можете использовать динамический SQL, но это еще сложнее, чем ваш SQL-запрос.