Если вы используете 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