Если вы используете MySQL 8.0, вы можете использовать оконные функции:
SELECT
c.cid,
title,
name,
weighting,
mark,
SUM(mark*weighting) OVER(PARTITION BY c.cid) final
FROM Grade g
JOIN Assessment a ON g.aid = a.aid
JOIN Course c ON a.cid = c.cid
WHERE sid = 'S0001';
Или, если вам просто нужен final
для «верхней» строки для каждой группы:
SELECT
c.cid,
title,
name,
weighting,
mark,
CASE WHEN ROW_NUMBER() OVER(PARTITIN BY c.cid ORDER BY name) = 1
THEN SUM(mark*weighting) OVER(PARTITION BY c.cid)
END final
FROM Grade g
JOIN Assessment a ON g.aid = a.aid
JOIN Course c ON a.cid = c.cid
WHERE sid = 'S0001'
ORDER BY cid, name
Я настоятельно рекомендую добавить к все столбцы, которые используются в запросе, псевдонимом таблицы, к которой они принадлежат, чтобы запрос был однозначным и более легким для понимания тем, кто не знает ваши структуры данных.
В более ранних версиях вы можете присоединиться к агрегатному запросу или использовать коррелированный подзапрос:
SELECT
c.cid,
title,
name,
weighting,
mark,
x.final
FROM Grade g
JOIN Assessment a ON g.aid = a.aid
JOIN Course c ON a.cid = c.cid
JOIN (
SELECT cid, SUM(mark*weighting)/100 AS Final
FROM Grade g
JOIN Assessment a ON g.aid = a.aid
WHERE sid = 'S0001'
GROUP BY cid
) x ON x.cid = c.cid
WHERE sid = 'S0001'