Агрегатные функции и HAVING: продвинутые группировки

Мы просто и по делу рассказываем про ИИ-инструменты для работы: сравнения, пошаговые гайды, бесплатные альтернативы и реальные сценарии применения. Помогаем выбрать между ChatGPT, Gemini, Claude, локальными моделями и десятками узкоспециализированных сервисов — от дизайна и HR до аналитики и SEO. Меньше хайпа, больше практики и экономии времени каждый день.

sqlагрегатные функцииgroup by

Когда данных много, обычный SELECT уже не спасает. Чтобы быстро получить сводную аналитику, в SQL используют агрегатные функции и оператор HAVING. Это база для отчетов, дашбордов и продуктовой аналитики.

Что делают агрегатные функции

Они считают итог по группе строк:

  • COUNT() — количество записей
  • SUM() — сумма
  • AVG() — среднее значение
  • MIN() / MAX() — минимум и максимум

Пример:

SELECT department, COUNT(*) AS employees
FROM staff
GROUP BY department;

Запрос покажет, сколько сотрудников в каждом отделе.

Зачем нужен GROUP BY

GROUP BY объединяет строки с одинаковыми значениями в группы. После этого можно применять агрегаты к каждой группе отдельно.

Например, сумма продаж по менеджерам:

SELECT manager_id, SUM(amount) AS total_sales
FROM orders
GROUP BY manager_id;

Чем HAVING отличается от WHERE

Это один из самых частых вопросов в SQL 👇

  • WHERE фильтрует строки до группировки
  • HAVING фильтрует группы после группировки

Пример: найти менеджеров, у которых продажи больше 100000:

SELECT manager_id, SUM(amount) AS total_sales
FROM orders
GROUP BY manager_id
HAVING SUM(amount) > 100000;

Если попробовать поставить это условие в WHERE, запрос не сработает, потому что агрегат вычисляется только после GROUP BY.

Продвинутые приемы

  1. Несколько агрегатов сразу
    SELECT category_id,
           COUNT(*) AS products_count,
           AVG(price) AS avg_price,
           MAX(price) AS max_price
    FROM products
    GROUP BY category_id;
    
  2. Группировка по нескольким полям
    SELECT country, city, COUNT(*) AS users_count
    FROM users
    GROUP BY country, city;
    

    Так можно строить более точную аналитику.

  3. HAVING с несколькими условиями
    SELECT customer_id, COUNT(*) AS orders_count, SUM(total) AS total_spent
    FROM orders
    GROUP BY customer_id
    HAVING COUNT(*) >= 5 AND SUM(total) > 50000;
    

Частые ошибки ⚠️

  • Использовать в SELECT поля, которых нет в GROUP BY и которые не обернуты в агрегат
  • Путать WHERE и HAVING
  • Не учитывать NULL: например, COUNT(column) не считает NULL, а COUNT(*) считает все строки

Когда это особенно полезно

  • отчеты по продажам
  • аналитика пользователей
  • контроль KPI
  • поиск аномалий в данных
  • подготовка витрин для BI 📈

Вывод

Агрегатные функции + GROUP BY + HAVING — это ключевой инструмент для работы с данными в SQL. Если понимать порядок выполнения запроса, можно строить сложные и точные выборки без лишней логики в коде 🔍

Подборка каналов про IT — удобный способ следить за SQL, аналитикой, backend и карьерой в технологиях 🚀

🗣 Подборки каналов
🧠 Каталог ботов и приложений
🗺 Навигация

Читайте так же