ВГОРУ

SQL-Урок 8. Групування даних (GROUP BY)

Групування даних дозволяє розділити всі дані на логічні набори, завдяки чому стає можливим виконання статистичних обчислень окремо в кожній групі.


1. Створення груп (GROUP BY)

Групи створюються за допомогою інструкції 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.

Варто також зазначити, що GROUP BY має іти після речення WHERE та перед ORDER BY.

2. Фільтруючі групи (HAVING)

Так само, як ми фільтрували рядки в таблиці, ми можемо здійснювати фільтрацію по згрупованим даним. Для цього в 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 шт.

3. Групування та сортування

Як і при звичайній вибірці даних, ми можемо посортувати групи після групування оператором 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.

MS Access не підтримує сортування груп за псевдонімами колонок, тобто в нашому прикладі, щоб посортувати значення, ми не зможемо в кінці запиту прописати ORDER BY Product_num.