Агрегаты и 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 |
Один запрос — и сразу виден бизнес-вывод: у инвестиций средний чек вдвое выше, чем у обычного вклада.
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 = имя.
Ключевые слова
2. Средний чек по каждому продукту (GROUP BY product).
3. Сколько вкладов у каждого клиента по имени (JOIN + GROUP BY).
4. Общая сумма вкладов по каждому городу (JOIN с clients + GROUP BY city).