Агрегация и группировка

Агрегатные функции: COUNT, SUM, AVG, MIN, MAX

Содержание курса

В прошлом уроке функции вроде ROUND или LENGTH принимали одно значение и возвращали одно значение — каждая строка обрабатывалась независимо. Агрегатные функции работают иначе: они принимают сразу весь набор строк и сворачивают его в одно итоговое число.

Агрегатная функция: набор строк → одно итоговое значение

Представьте, что вам нужно узнать не содержимое конкретной строки, а что-то про всю таблицу целиком: сколько в ней заказов, какова их общая сумма, каков средний чек. Обычный SELECT здесь не поможет — он возвращает по одной строке на каждую запись. Агрегатная функция делает другое: она получает на вход множество строк и возвращает одно число.

Когда в SELECT стоят только агрегатные функции и нет GROUP BY, результат — всегда ровно одна строка. Не одна строка на каждый заказ, не пустой результат — именно одна строка с итоговыми значениями по всей таблице.

Пять основных функций выглядят так:

SELECT
    COUNT(*)          AS количество,
    SUM(amount)       AS итого,
    AVG(amount)       AS среднее,
    MIN(amount)       AS минимум,
    MAX(amount)       AS максимум
FROM orders;

Этот запрос вернёт одну строку с пятью столбцами. COUNT(*) — сколько строк в таблице. SUM(amount) — арифметическая сумма всех значений столбца amount. AVG(amount) — среднее арифметическое. MIN и MAX — наименьшее и наибольшее значение соответственно.

Почему именно одна строка? Потому что агрегатные функции в этом запросе описывают весь набор как единое целое. Пока мы считаем итог по всей таблице, в SELECT оставляйте только агрегатные выражения: тогда результатом будет одна строка. Как получить отдельный итог для каждой категории или клиента, разберём в следующем уроке.

Пять агрегатных функций на трёх строках

Запустите запрос целиком в SQLite или PostgreSQL. Временный набор orders содержит суммы 100, 300 и неизвестную сумму NULL:

WITH orders(amount) AS (
    VALUES (100), (300), (NULL)
)
SELECT COUNT(*) AS rows_total,
       COUNT(amount) AS amounts_known,
       SUM(amount) AS total,
       AVG(amount) AS average,
       MIN(amount) AS smallest,
       MAX(amount) AS largest
FROM orders;

Получится одна строка: 3 | 2 | 400 | 200 | 100 | 300. COUNT(*) увидел все три строки. Остальные функции использовали два известных значения: среднее равно 400 / 2, а не 400 / 3. Это различие пригодится при расчёте среднего чека по неполной выгрузке.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.