Результат реализации запроса:
Server: Msg 147
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.
Пример 61
Задача.
Сформировать запрос для вывода названий студенческих групп, если средняя оценка по студенческой группе выше 3. Значение оценки округлить до одной десятой.
Решение.
SELECT NameGroup, Round(AVG(Mark),1)[Средняя оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
INNER JOIN SGroup SG
ON S.IDGroup=SG.IDGroup
GROUP BY NameGroup
HAVING AVG(Mark)>3
Результат реализации запроса:
Тем не менее, не следует использовать HAVING там, где достаточно применения WHERE (см.Пример 62)
Пример 62
Задание.
Сформировать запрос для расчета средней оценки по студенческой группе ИСТ-02
Решение:
Задача может быть решена двумя способами. В первом случае производится расчет средней оценки в каждой группе, а затем выбирается оценка, соответствующая группе ИСТ-02. Во втором случае сначала отсекаются все записи, соответствующие группе ИСТ-02, а только затем вычисляется средняя оценка. Очевидно, не надо доказывать, что вторая реализация оптимальна.
Реализация с использованием HAVING
SELECT NameGroup, Round(AVG(Mark),1)[Средняя оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
INNER JOIN SGroup SG
ON S.IDGroup=SG.IDGroup
GROUP BY NameGroup
HAVING NameGroup='ИСТ-02'
Реализация с использованием WHERE
SELECT NameGroup, Round(AVG(Mark),1)[Средняя оценка]
FROM Progress P INNER JOIN Student S
ON P.NRecordBook=S.NRecordBook
INNER JOIN SGroup SG
ON S.IDGroup=SG.IDGroup
WHERE NameGroup='ИСТ-02'
GROUP BY NameGroup [7]
Результат реализации запроса: