Язык Transact-SQL поддерживает шесть обычных агрегатных функций:
♦ min;
♦ max;
♦ sum;
♦ avg;
♦ count;
♦ count_big.
Все агрегатные функции оперируют одним аргументом, который может быть либо столбцом, либо выражением. Существует только исключение во второй форме функций count и count_big: count(*) и count_big(*). Результатом каждой агрегатной функции является константное значение, которое отображается в отдельном столбце результата.
Агрегатные функции появляются в списке выбора оператора select, который может включать предложение group by. Если в операторе select нет предложения group by, а в списке выбора присутствует хотя бы одна агрегатная функция, то никакой простой столбец не может быть включен в список выбора (кроме как в качестве аргумента агрегатной функции). По этой причине пример 6.28 ошибочен.
Столбец emplname таблицы employee не должен присутствовать в списке выбора select в примере 6.28, потому что он не является аргументом агрегатной функции. С другой стороны, все имена столбцов, которые не являются аргументами агрегатной функции, могут присутствовать в списке выбора select, если они используются для группирования результата.
Аргументу агрегатной функции может предшествовать одно из двух ключевых слов:
♦ all. Указывает, что должны использоваться все значения столбца (all - значение по умолчанию);
♦ distinct. Устраняет дублирующие значения столбца перед применением агрегатной функции.
Агрегатные функции min и мах. Агрегатные функции min и мах вычисляют, соответственно, наименьшее и наибольшее значение в столбце. Если в операторе присутствует предложение where, то функции min и мах возвращают наименьшее или наибольшее значение в выбранных строках. В примере 6.29 показано использование агрегатной функции min.
Результат примера 6.29 не является дружественным к пользователю. Например, нам не известно имя служащего с наименьшим номером. Как было показано, явное задание столбца emp name в списке выбора select недопустимо. Для поиска имени служащего с наименьшим номером используется подзапрос, как показано в примере 6.30, где внутренний запрос содержит оператор select из предыдущего примера.
В примере 6.31 показано использование агрегатной функции мах.
Аргументом функций min и мах может быть также строковое значение и дата. Если аргументом является строковое значение, то сравнение всех значений будет осуществляться с использованием фактического порядка сортировки. Для всех аргументов типа данных «дата/время» более ранняя дата означает меньшее значение, а более поздняя дата - большее значение в столбце.
Опция distinct не может быть использована в агрегатных функциях min и мах. Все значения null в столбце, который является аргументом функций min или мах, всегда исключаются перед использованием функций min и мах.
Агрегатная функция sum. Агрегатная функция sum вычисляет сумму значений столбца. В примере 6.32 показано использование функции sum.
Агрегатная функция в примере 6.32 группирует все значения бюджетов проектов и определяет их общую сумму. По этой причине запрос в примере 6.32 (как и любой аналогичный запрос) неявно содержит функцию группировки. Запустив SQL Server 2008, вы можете явно записать функцию группирования в запросе, показанном в примере 6.32, использовав предложение group ву (примера 6.33).
Рекомендуется использование нового синтаксиса предложения group by, потому что в этом случае явно задается группирование. (Описываются некоторые другие возможности group by, которые являются новыми в SQL Server 2008.)
Опция distinct исключает все дубликаты значений в столбце перед применением функции sum. Аналогично, все значения null всегда исключаются до применения sum.
Агрегатная функция avg. Агрегатная функция avg вычисляет среднее значение столбца. Аргументом функции avg может быть только число. Все значения null исключаются перед применением функции avg. Пример 6.34 показывает использование агрегатной функции avg.
Агрегатные функции count и count_big. Агрегатная функция count имеет две различные формы:
count ([distinct] col_name) count (*)
Первая форма вычисляет количество значений в столбце col_name. Если используется ключевое слово distinct, то исключаются все дубликаты значений перед применением count. Эта форма count не подсчитывает значения null в столбце.
В примере 6.35 показано использование первой формы агрегатной функции count.
Как можно увидеть из результата примера 6.35, все значения null исключены до применения функции count (distinct job). Получена сумма всех значений столбца 8 вместо 11.
Вторая форма функции count, count(*), подсчитывает количество строк в таблице. Или, если в операторе select присутствует предложение where, функция возвращает количество строк, для которых условие в where истинно. В отличие от первой формы функции count вторая форма не исключает значения null, потому что эта функция оперирует строками, а не со столбцами. Пример 6.36 показывает использование count (*).
Функция count_big аналогична функции count. Единственное между ними различие заключается в возвращаемом значении: countbig всегда возвращает значение типа данных bigint, а функция count - значение типа данных integer.