Короткий ответ
GROUP BY объединяет строки с одинаковыми значениями выбранных полей и применяет агрегаты к каждой группе. Группировка по дате и кампании превращает детализацию объявлений в компактный отчёт, где расход и конверсии можно сравнивать на одном уровне.
Как это работает подробнее
В SELECT должны находиться поля группировки и агрегированные выражения, например SUM(spend). GROUP BY date, campaign_id создаёт по одной строке на каждую такую комбинацию; WHERE фильтрует исходные строки до агрегации, а HAVING — уже сформированные группы.
- Зерно данных. Сначала решите, какой уровень детализации нужен отчёту; лишние поля в GROUP BY дробят группы.
- Средние метрики. Суммируйте числитель и знаменатель отдельно, затем рассчитывайте отношение на агрегированном уровне.
Пример кода
daily_campaign_spend.sql
SELECT report_date, campaign_id, SUM(spend) AS spend, SUM(conversions) AS conversions
FROM ad_stats
WHERE report_date >= '2026-10-01' AND report_date < '2026-11-01'
GROUP BY report_date, campaign_id
ORDER BY report_date, campaign_id;Что использовать на практике
- Срез отчёта. Включайте в GROUP BY только измерения, по которым читатель должен сравнивать результат.
- Имена кампаний. Для стабильного объединения предпочтительнее campaign_id; названия оставляйте для отображения.
Подводные камни
- Случайная детализация. Добавление ad_id может превратить ожидаемую строку на кампанию в множество строк.
- Неполные суммы. Проверьте фильтр дат, часовой пояс и дубликаты источника, если агрегат не совпадает с кабинетом.