GROUP BY NameGroup

Результат реализации запроса:

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]

Результат реализации запроса:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: