Поиск нескольких средних значений(AVG) по разным ключам и так же с COUNT

Рейтинг: 0Ответов: 1Опубликовано: 27.04.2023

Даны 3 таблицы:Пример таблиц

  1. Написать запрос, в котором будет показана средняя успеваемость (оценка - score) по каждому предмету в виде title, средняя оценка

(Средняя успеваемость не одного ученика, а именно по данному предмету)

Не понимаю, как взять среднее значение по определённым предметам

Нашел что-то на данную тему и пытался реализовать:

SELECT (SELECT title FROM subjects) avg1, (SELECT AVG(score) FROM scores) avg2;

Однако ошибка использования агрегатных функций

2. Написать запрос, в котором будут отображены ученики (name) у которых есть оценки(score) по всем предметам

Пытался написать:

select _name from students, subjects, scores
where students.st_id = scores.st_id and subjects.subj_id = scores.subj_id and count(score) = count(subj_id);

Однако ошибка использования групповой функции

Создание таблиц (если нужно):

CREATE TABLE students (
    st_id INT UNIQUE PRIMARY KEY AUTO_INCREMENT,
    _name TEXT
);

CREATE TABLE subjects (
    subj_id INT UNIQUE PRIMARY KEY AUTO_INCREMENT, 
    title TEXT,
    hours INT unsigned -- Целое число >= 0
);

CREATE TABLE scores (
    score_id INT UNIQUE PRIMARY KEY AUTO_INCREMENT,
    st_id INT,
    subj_id INT,
    score INT CHECK(score >= 2 AND score <= 5),
    FOREIGN KEY (st_id) REFERENCES students (st_id) ON DELETE RESTRICT ON UPDATE CASCADE,
    FOREIGN KEY (subj_id) REFERENCES subjects (subj_id) ON DELETE CASCADE ON UPDATE CASCADE, 
    UNIQUE INDEX (st_id, subj_id)
);

Ответы

▲ 0Принят
SELECT subjects.title, AVG(scores.score) average
FROM subjects
LEFT JOIN scores ON (scores.subj_id = subjects.subj_id)
GROUP BY subjects.subj_id