Подсчитайте количество студентов выше и ниже среднего балла в SQL - PullRequest
1 голос
/ 04 апреля 2020

У меня есть пример таблицы ниже, и я пытаюсь получить число учащихся выше среднего балла, а количество студентов ниже среднего балла.

name    subject classroom   classarm    session     first_term_score    first_term_grade
std1    math    nursery 1A  nursery1    2018/2019     90                 A
std2    eng     nursery 1A  nursery1    2018/2019     70                 A
std3    sci     nursery 1A  nursery1    2018/2019     60                 B
std1    eng     nursery 1A  nursery1    2018/2019     64                 B
std2    math    nursery 1A  nursery1    2018/2019     70                 A

Таблица целевых результатов должна выглядеть следующим образом

subject   avg_score count_above   count_below
math         80      1                1
eng          65.5    2                0

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

SELECT name 
    FROM (SELECT name,
                 AVG(first_term_score) AS average_result
          FROM seveig
          GROUP BY name) sa, 
         (SELECT (AVG(first_term_score)) tavg
          FROM seveig) ta
     WHERE sa.average_result > ta.tavg

Проблема здесь заключается в том, что я хочу добавить количество в таблицу, указывающее количество студентов выше и ниже среднего балла.

Если число равно среднему баллу, его можно рассматривать как выше среднего балла.

1 Ответ

2 голосов
/ 04 апреля 2020

Если вы используете MySQL 8.0, вы можете использовать оконные функции и агрегацию:

select
    subject,
    avg_score,
    sum(first_term_score >= avg_score) count_above,
    sum(first_term_score <  avg_score) count_below
from (
    select t.*, avg(first_term_score) over(partition by subject) avg_score
    from mytable t
) t
group by subject, avg_score

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

select
    t.subject,
    a.avg_score,
    sum(t.first_term_score >= a.avg_score) count_above,
    sum(t.first_term_score <  a.avg_score) count_below
from mytable t
inner join (
    select subject, avg(first_term_score) avg_score
    from mytable
    group by subject
) a on a.subject = t.subject
group by t.subject, a.avg_score

Редактировать : вы, похоже, запускаете большой запрос, а не MySQL, как изначально помечено. Вы можете использовать COUNTIF():

select
    subject,
    avg_score,
    countif(first_term_score >= avg_score) count_above,
    countif(first_term_score <  avg_score) count_below
from (
    select t.*, avg(first_term_score) over(partition by subject) avg_score
    from mytable t
) t
group by subject, avg_score
...