Модуль 5 · SQL

Агрегаты и GROUP BY: считать итоги

До сих пор SQL показывал строки как есть. Агрегаты делают наоборот — сминают кучу строк в одно число: сколько, на сколько, в среднем.

🧮 Главная идея: из многих строк — одно число Обычный SELECT работает построчно. Агрегат (от англ. aggregate — «сводить вместе») берёт целый столбец и сворачивает его в один итог. Три главных, которые закрывают почти всё:
АгрегатОтвечает на вопросПример
COUNTСколько строк (штук)COUNT(*)
SUMНа какую сумму (сложить)SUM(amount)
AVGСреднее (средний чек)AVG(amount)

COUNT — сколько штук

SELECT COUNT(*) FROM deposits

COUNT(*) — «сосчитай все строки подряд» (звёздочка = «все», как и в SELECT *). Вернёт одно число — сколько всего вкладов.

С фильтром считаем только нужное — например, сколько именно продуктов «Вклад»:

SELECT COUNT(*) FROM deposits WHERE product = 'Вклад'

AS — дать колонке имя

Когда считаешь число «на лету», у колонки нет своего имени, и SQL подпишет её буквально текстом запроса — count(*). Чтобы заголовок был человеческим — псевдоним через AS (англ. «как»):

SELECT COUNT(*) AS количество_вкладов FROM deposits WHERE product = 'Вклад'
🚫 Грабли: «количество» ≠ «сумма» COUNT считает штуки (сколько сделок), SUM складывает деньги (на какой объём). Это разные вопросы — и в бизнесе тоже: план бывает по числу сделок и по обороту. Не путай их даже в названии колонки.

SUM и AVG — деньги и средний чек

SELECT SUM(amount) AS объём_вкладов  FROM deposits WHERE product = 'Вклад'
SELECT AVG(amount) AS средний_чек    FROM deposits WHERE product = 'Вклад'

В скобках — конкретный столбец, который складываем или усредняем (не *, а именно amount).

GROUP BY — итог по каждой группе сразу

Считать средний чек по каждому продукту отдельными запросами (WHERE product = 'Вклад', потом 'ПДС', потом 'НСЖ'…) — тоскливо. GROUP BY (англ. «сгруппировать по») делает это одним запросом.

🗃 Как это представить: разложить строки по кучкам GROUP BY product = «раздели все строки на кучки по продукту, и посчитай агрегат для каждой кучки». Вместо одного числа получаешь строку на каждую группу.
SELECT product, AVG(amount) AS средний_чек
FROM deposits
GROUP BY product
productсредний_чек
Альфа-Инвестиции516 666
Вклад271 666
НСЖ150 000
ПДС160 000

Один запрос — и сразу виден бизнес-вывод: у инвестиций средний чек вдвое выше, чем у обычного вклада.

🚫 Главная ловушка GROUP BY: сырой столбец врёт Если написать SELECT product, amount … GROUP BY product, то в кучке «Вклад» шесть разных сумм — какую из них показать? SQL молча возьмёт первую попавшуюся (например, 100000 вместо среднего 271666). Число будет выглядеть настоящим, но соврёт.

Правило: после GROUP BY каждый столбец в SELECT — либо тот, по которому группируешь (product), либо завёрнут в агрегат (AVG(amount)). Сырой столбец из кучки показывать нельзя.

JOIN + GROUP BY — самая частая связка

Группировать удобнее по-человечески — не по номеру клиента, а по имени. Имя лежит в clients, значит склеиваем листы и группируем по имени:

SELECT clients.name, COUNT(*) AS вкладов
FROM deposits
JOIN clients ON deposits.client_id = clients.id
GROUP BY clients.name

Получаем «сколько вкладов у каждого клиента» — по именам. Это готовая строка для отчёта или дашборда.

💡 Кто попадёт в результат Обычный JOIN покажет только тех, у кого есть хотя бы один вклад. Клиент без вкладов не образует кучку — и выпадет. Если нужно показать и его (с нулём) — берётся LEFT JOIN (см. конспект 4). И помни: клеим по ключу число = число (client_id = id), а не id = имя.

Ключевые слова

COUNT — сколько штук SUM — сложить деньги AVG — средний чек AS — имя колонки GROUP BY — итог по группам только группа-столбец или агрегат в SELECT JOIN + GROUP BY — итоги по именам
🎯 Проверь себя на базе банк.db (без подсказок) 1. Сколько всего вкладов и на какую общую сумму (COUNT и SUM).
2. Средний чек по каждому продукту (GROUP BY product).
3. Сколько вкладов у каждого клиента по имени (JOIN + GROUP BY).
4. Общая сумма вкладов по каждому городу (JOIN с clients + GROUP BY city).