SQL, сгруппируйте один столбец и посчитайте его атрибуты

0

Скажем, у меня есть 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: да, это школьное задание, и я хочу искать больше решений :) Понятно, дайте мне больше советов.

  • 2
    это подходящее решение
  • 3
    Единственная альтернатива, о которой я могу подумать, - это использовать динамический SQL для построения нужного сводного запроса. Но это может быть за рамками того, что вы делаете.
Показать ещё 5 комментариев
Теги:

1 ответ

2

Нет более простого способа сделать это. На самом деле, я бы упростил логику (при условии, что 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-запрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню