В любой сфере, где собираются данные о клиентах, услугах и результатах, агрегатные функции SQL становятся незаменимыми инструментами аналитики. В этой статье мы разберём, как использовать три самых популярных агрегата — COUNT, AVG и SUM — для построения полезных отчётов о работе гадалок.
Содержание
- Пример схемы базы данных «Гадальная студия»
- COUNT – подсчёт количества записей
- AVG – среднее значение
- SUM – суммирование
- GROUP BY и HAVING: группировка и фильтрация
- Полезные советы и типичные подводные камни
Агрегатные функции — это специальные функции SQL, которые принимают набор строк (строковую «коллекцию») и возвращают одно скалярное значение. Они применяются в запросах SELECT совместно с оператором GROUP BY или без него, если требуется агрегировать всю таблицу целиком.
COUNT— считает количество строк (или непустых значений столбца).AVG, вычисляет среднее арифметическое числового столбца.SUM— суммирует все значения числового столбца.
Эти функции работают одинаково во всех популярных СУБД: MySQL, PostgreSQL, Microsoft SQL Server, Oracle и др.
Пример схемы базы данных «Гадальная студия»
Для демонстрации возьмём простую схему, в которой хранится информация о сеансах гаданий, их стоимости и отзывах клиентов.
CREATE TABLE Гадалки (
id INT PRIMARY KEY,
имя VARCHAR(50) NOT NULL,
специализация VARCHAR(30) -- например, «Таро», «Нумерология», «Хиромантия»
);
CREATE TABLE Сеансы (
id INT PRIMARY KEY,
гадалка_id INT REFERENCES Гадалки(id),
клиент_id INT,
дата DATE,
стоимость DECIMAL(10,2), -- стоимость сеанса в рублях
рейтинг TINYINT -- оценка от 1 до 5
);
С помощью этой схемы мы сможем собрать статистику:
- Сколько сеансов провела каждая гадалка (
COUNT). - Средний рейтинг её работы (
AVG). - Общая выручка (
SUM).
COUNT – подсчёт количества записей
Общее количество сеансов за всё время
SELECT COUNT(*) AS Общее_количество_сеансов
FROM Сеансы;
Результат будет выглядеть, например, так:
Общее_количество_сеансов
-----------------------
1245
Сеансы по каждой гадалке
SELECT g.имя,
COUNT(s.id) AS Количество_сеансов
FROM Гадалки g
LEFT JOIN Сеансы s ON g.id = s.гадалка_id
GROUP BY g.id, g.имя
ORDER BY Количество_сеансов DESC;
Здесь LEFT JOIN гарантирует, что даже у гадалки без сеансов появится строка с нулём.
Подсчёт уникальных клиентов
SELECT COUNT(DISTINCT клиент_id) AS Уникальных_клиентов
FROM Сеансы;
Эта метрика часто используется для оценки «охвата» студии.
AVG – среднее значение
Средний рейтинг гадалки
SELECT g.имя,
AVG(s.рейтинг) AS Средний_рейтинг
FROM Гадалки g
JOIN Сеансы s ON g.id = s.гадалка_id
GROUP BY g.id, g.имя
HAVING COUNT(s.id) >= 5 -- учитываем только тех, у кого минимум 5 отзывов
ORDER BY Средний_рейтинг DESC;
Функция AVG автоматически игнорирует NULL‑значения, поэтому сеансы без оценки не влияют на результат.
Средняя стоимость сеанса по специализации
SELECT g.специализация,
AVG(s.стоимость) AS Средняя_стоимость
FROM Гадалки g
JOIN Сеансы s ON g.id = s.гадалка_id
GROUP BY g.специализация;
Эта аналитика помогает понять, какие виды гаданий более прибыльны.
SUM – суммирование
Общая выручка студии
SELECT SUM(стоимость) AS Общая_выручка
FROM Сеансы;
Выручка по гадалкам
SELECT g.имя,
SUM(s.стоимость) AS Выручка_гадалки
FROM Гадалки g
JOIN Сеансы s ON g.id = s.гадалка_id
GROUP BY g.id, g.имя
ORDER BY Выручка_гадалки DESC;
Выручка за конкретный месяц
SELECT DATE_FORMAT(дата, '%Y-%m') AS Месяц,
SUM(стоимость) AS Выручка_в_мес
FROM Сеансы
WHERE дата BETWEEN '2026-01-01' AND '2026-12-31'
GROUP BY Месяц
ORDER BY Месяц;
В MySQL используется DATE_FORMAT, в PostgreSQL — TO_CHAR, а в SQL Server — FORMAT или CONVERT.
GROUP BY и HAVING: группировка и фильтрация
Комбинация GROUP BY + агрегатных функций позволяет получать «срезы» данных. HAVING применяется для фильтрации уже агрегированных результатов (в отличие от WHERE, который фильтрует строки до агрегации).
Пример: топ‑3 гадалки по выручке, у которых средний рейтинг выше 4,0
SELECT g.имя,
SUM(s.стоимость) AS Выручка,
AVG(s.рейтинг) AS Средний_рейтинг,
COUNT(s.id) AS Кол_сеансов
FROM Гадалки g
JOIN Сеансы s ON g.id = s.гадалка_id
GROUP BY g.id, g.имя
HAVING AVG(s.рейтинг) > 4.0
ORDER BY Выручка DESC
LIMIT 3;
Здесь HAVING отсекает гадалок с низким рейтингом, а LIMIT (или TOP в SQL Server) оставляет только три лучших.
Полезные советы и типичные подводные камни
- NULL‑значения. Агрегатные функции игнорируют
NULL, ноCOUNT()считает все строки, аCOUNT(column)— только непустые. Если нужно «полное» количество, используйтеCOUNT(). - Тип данных. Для
AVGиSUMвыбирайте типы с достаточной точностью (например,DECIMAL(12,2)), иначе возможна потеря копеек. - Индексы. При больших таблицах ускорьте запросы, создавая индексы по колонкам, участвующим в
JOINиWHERE(например,гадалка_id,дата). - Пост‑агрегационная фильтрация. Не путайте
WHEREиHAVING. Если нужно отобрать только те группы, у которых, к примеру, выручка > 100 000 ₽, используйтеHAVING SUM(стоимость) > 100000. - Параллельные запросы. Современные СУБД (PostgreSQL 15+, MySQL 8+, SQL Server 2019+) умеют распараллеливать агрегацию, но это работает лучше, когда данные распределены по нескольким файлам/страницам.
- Кеширование результатов. Если отчёт «выручка за месяц» нужен часто, рассмотрите материализованный представление (
MATERIALIZED VIEW) или предвычисление в отдельной таблице.
Агрегатные функции COUNT, AVG и SUM — фундаментальные инструменты для любой аналитики, в т.ч. и в столь необычной сфере, как статистика гадалок. С их помощью можно быстро получить:
- Объём работы каждого предсказателя;
- Средний уровень удовлетворённости клиентов;
- Общую и по‑специализации выручку.
Правильное построение запросов, учёт NULL, использование GROUP BY/HAVING и оптимизация индексов позволяют получать точные и быстрые отчёты даже при больших объёмах данных.
Теперь вы вооружены знаниями, чтобы построить любые отчёты о работе вашей «Гадальной студии» и принимать решения, основанные на реальной статистике.
Автор: ваш виртуальный помощник, 2026‑08‑09