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 nameCode language: SQL (Structured Query Language) (sql)

Результат:

Винт	2
Гайка	3
Шайба	1Code language: SQL (Structured Query Language) (sql)

Обратите внимание, что условие WHERE относится к данным до их группировки. Если же необходимо выполнить фильтрацию результата группировки, то используется ключевое слово HAVING:

В данном примере после получения сгруппированных данных к ним применяется фильтр, чтобы отобразить только те имена, которые имеют повторения:

SELECT name, count(*) as cnt FROM item 
GROUP BY name
HAVING cnt>1Code language: SQL (Structured Query Language) (sql)

Результат:

Винт	2
Гайка	3Code language: SQL (Structured Query Language) (sql)

📝 Сортировка всегда указывается последней, так как она всегда относится к конечному результату и не влияет на промежуточные данные.

SELECT name, count(*) as cnt FROM item
GROUP BY name 
HAVING cnt>1
ORDER BY cnt DESCCode language: SQL (Structured Query Language) (sql)

Результат:

Гайка	3
Винт	2Code language: SQL (Structured Query Language) (sql)

☝ Группировка является мощным механизмом, необходимым при построении аналитических отчетов.

Закрепим полученные знания на практике.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *