Группировка данных позволяет разделить все данные на логические наборы, благодаря чему становится возможным выполнение статистических вычислений по отдельности в каждой группе.
Группы создаются с помощью инструкции GROUP BY оператора SELECT. Рассмотрим на примере.
Run SQLSELECT Product, SUM(Quantity) AS Product_num
FROM Sumproduct
GROUP BY Product
Данным запросом мы извлекли информацию о количестве реализуемой продукции в каждом месяце. Оператор SELECT приказывает вывести два столбца Product – название продукта и Product_num – расчетное поле, которое мы создали для отображения количества реализуемой продукции (формула поля SUM(Quantity)). Предложение GROUP BY указывает СУБД сгруппировать данные по столбцу Product.
Так же, как мы фильтровали строки в таблице, мы можем производить фильтрацию по сгруппированным данным. Для этого в SQL существует оператор HAVING. Возьмем предыдущий пример и добавим фильтрацию по группам.
Run SQLSELECT Product, SUM(Quantity) AS Product_num
FROM Sumproduct
GROUP BY Product
HAVING SUM(Quantity) > 4000
Видим, что после того, как было сочтено количество реализованного товара в разрезе каждого продукта, СУБД "отрубила" те продукты, которых было реализовано менее 4000 шт.
Как видим, оператор HAVING очень подобен оператору WHERE, однако между собой они имеют существенное отличие: WHERE фильтрует данные до того, как они будут сгруппированы, а HAVING - осуществляет фильтрацию после группировки. Таким образом, строки, которые были удалены предложением WHERE, не будут включены в группу. Итак, операторы WHERE и HAVING могут использоваться в одном предложении. Рассмотрим пример:
Run SQLSELECT Product, SUM(Quantity) AS Product_num
FROM Sumproduct
WHERE Product <> 'Skis Long'
GROUP BY Product
HAVING SUM(Quantity) > 4000
Мы к предыдущему примеру добавили оператор WHERE, где указали товар "Skis Long", что в свою очередь повлияло на группировку оператором HAVING. Как результат мы видим, что товар "Skis Long" не попал в перечень групп с количеством реализованной продукции более 4000 шт.
Как и при обычной выборке данных, мы можем отсортировать группы после группировки оператором HAVING. Для этого мы можем использовать уже знакомый нам оператор ORDER BY. В данной ситуации его применение аналогично предыдущим примерам. К примеру:
Run SQLSELECT Product, SUM(Quantity) AS Product_num
FROM Sumproduct
GROUP BY Product
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)
или просто укажем номер поля по порядку, по которому хотим посортировать:
Run SQLSELECT Product, SUM(Quantity) AS Product_num
FROM Sumproduct
GROUP BY Product
HAVING SUM(Quantity) > 3000
ORDER BY 2
Видим, что для сортировки сводных результатов нам нужно просто прописать предложение из ORDER BY после оператора HAVING.