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

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

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

Групи створюються за допомогою речення GROUP BY оператора SELECT. Розглянемо на прикладі.

SELECT 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. Візьмемо попередній приклад та додамо фільтрацію по групам.

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>4000

Бачимо, що після того, як була порахована кількість реалізованого товару в розрізі кожного продукту, СУБД "відсікла" ті продукти, яких було реалізовано менше 4000 шт.

Як бачимо, оператор HAVING дуже подібний до оператора WHERE, проте між собою вони мають суттєву відмінність: WHERE фільтрує дані до того, як вони будуть згруповані, а HAVING - здійснює фільтрацію після групування. Таким чином, рядки, які були вилучені реченям WHERE не будуть включені в групу. Отож, оператори WHERE та HAVING можуть використовуватись в одному реченні. Розглянемо приклад:

SELECT 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. В даній ситуації його застосування аналогічне попереднім прикладам. Наприклад:

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>3000 ORDER BY SUM(Quantity)

або просто вкажемо номер поля по порядку, по якому хочемо посортувати:

SELECT Product, SUM(Quantity) AS Product_num FROM Sumproduct GROUP BY Product HAVING SUM(Quantity)>3000 ORDER BY 2

Бачимо, що для сортування зведених результатів нам потрібно просто прописати речення з ORDER BY після оператора HAVING. Проте є один нюанс. СУБД Access не підтримує сортування груп за псевдонімами колонок, тобто в нашому прикладі, щоб посортувати значення, ми не зможемо в кінці запиту прописати ORDER BY Product_num.

Статті по темі:

  • SQL-Урок 7. Функції обробки даних
  • SQL-Урок 9. Підзапити