Групповые функции и предложение GROUP BY

Групповые функции (см. Приложение 3. Агрегатные функции) обрабатывают множество строк и возвращают, как правило, один результат на группу. По умолчанию все строки таблицы рассматриваются как одна группа. Для более детальной группировки строк используется предложение GROUP BY, которое делит строки на группы. В случае применения GROUP BY предложение SELECT должно содержать столбцы, идентифицирующие группы, остальные столбцы могут быть использованы в предложении Select только как аргументы агрегатных функций.

Пример 59

Задача.

Сформировать запрос для вывода наибольшей, наименьшей и средней оценки для каждого студента.

Решение.

SELECT P.NRecordBook [№ зачетки],

SName [Имя студента],

MAX(Mark) [Максимальная оценка],

MIN(Mark) [Минимальная оценка],

AVG(Mark)[Средняя оценка]

FROM Progress P INNER JOIN Student S

ON P.NRecordBook=S.NRecordBook

GROUP BY P.NRecordBook, SName

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

Для каждой группы будет выведена только одна строка.

С предложением GROUP BY могут быть использованы все остальные команды SELECT, например, с помощью предложения WHERE можно исключить строки, которые не должны участвовать в запросе, допустим строки с признаком NULL. Рассмотрим это на примере применения агрегированной функции COUNT(). Функция COUNT() с аргументом отличным от *, игнорирует строки с признаком NULL, в то время как функция вида COUNT(*) посчитает все строки, в том числе и строки, в которых есть атрибуты с признаком NULL.

SELECT COUNT(*) [Количество оценок],

SUM(Mark)[Сумма баллов],

AVG(Mark)[Средняя оценка]

FROM Progress

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

В этом случае функция COUNT() посчитает все строки, а функции SUM() и AVG() будут учитывать только те строки, в которых оценка NOT NULL.

SELECT COUNT(Mark) [Количество оценок],

SUM(Mark)[Сумма баллов],

AVG(Mark)[Средняя оценка]

FROM Progress

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

Здесь функция COUNT() будет работать с теми же строками, что и функции SUM() и AVG(). Исключить возможные неоднозначности можно включив в запрос условие отбора строк: предложение WHERE mark Not NULL.

SELECT COUNT(*) [Количество оценок],

SUM(Mark)[Сумма баллов],

AVG(Mark)[Средняя оценка]

FROM Progress


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



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