GROUP BY. HAVING.
Если в запросе одновременно используются поля (выражения) и агрегатные функции, то используемые поля должны быть описаны в операторе группировки. Это означает, что результат агрегатных функций вычисляется не для всего набора данных, а для каждой группы данных.
SELECT <поле 1>, <поле 2>,... <поле n>, <функция>
FROM <источник>
[ WHERE <условие отбора для данных> ]
GROUP BY <поле 1>, <поле 2>,... <поле n>
[ HAVING <условие для групп> ]
[ ORDER BY <условия сортировки> ]
Code language: SQL (Structured Query Language) (sql)
Таким образом, данный вариант запроса позволяет фильтровать группы по результатам работы агрегатных функций.
Простой пример группировки: группируем по полю с названием и вычисляем количество записей для каждой группы:
SELECT name, count(*) FROM item GROUP BY name
Code language: SQL (Structured Query Language) (sql)
Результат:
Винт 2
Гайка 3
Шайба 1
Code language: SQL (Structured Query Language) (sql)
Обратите внимание, что условие WHERE относится к данным до их группировки. Если же необходимо выполнить фильтрацию результата группировки, то используется ключевое слово HAVING:
В данном примере после получения сгруппированных данных к ним применяется фильтр, чтобы отобразить только те имена, которые имеют повторения:
SELECT name, count(*) as cnt FROM item
GROUP BY name
HAVING cnt>1
Code language: SQL (Structured Query Language) (sql)
Результат:
Винт 2
Гайка 3
Code language: SQL (Structured Query Language) (sql)
📝 Сортировка всегда указывается последней, так как она всегда относится к конечному результату и не влияет на промежуточные данные.
SELECT name, count(*) as cnt FROM item
GROUP BY name
HAVING cnt>1
ORDER BY cnt DESC
Code language: SQL (Structured Query Language) (sql)
Результат:
Гайка 3
Винт 2
Code language: SQL (Structured Query Language) (sql)
☝ Группировка является мощным механизмом, необходимым при построении аналитических отчетов.
Закрепим полученные знания на практике.