Это может дать результат, который вы ищете. Не могли бы вы проверить это на своих данных.
SELECT
t.id as teacherid,
t.full_name teacherfullname,
COUNT(*) AS total_rows,
IF
(
count(*)% 2 = 1,
CAST(
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT( s.score ORDER BY s.score SEPARATOR ',' ),
',',
50 / 100 * COUNT(*)),
',',
- 1
) AS DECIMAL
),
ROUND((
CAST(
SUBSTRING_INDEX(
SUBSTRING_INDEX( GROUP_CONCAT( s.score ORDER BY s.score SEPARATOR ',' ), ',', 50 / 100 * COUNT(*) + 1 ),
',',
- 1
) AS DECIMAL
) + CAST(
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT( s.score ORDER BY s.score SEPARATOR ',' ),
',',
50 / 100 * COUNT(*)),
',',
- 1
) AS DECIMAL
)) / 2
)) AS median
FROM
teacher t
JOIN course_work cw ON cw.teacher_id = t.id
JOIN submission s ON cw.id = s.course_work_id
WHERE
s.score IS NOT NULL
GROUP BY
teacherid
ORDER BY
s.score