SQL, сгруппируйте один столбец и посчитайте его атрибуты - PullRequest
0 голосов
/ 25 мая 2018

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

1 Ответ

0 голосов
/ 25 мая 2018

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

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