SQL-вираз GROUP BY

Матеріал представлений на сторінці взятий з ресурсу http://www.w3schools.com/sql/


Агрегатні функції часто потребують додаткового виразу GROUP BY
SQL-вираз GROUP BY використовується для об'єднання агрегатних функцій за групами результуючих даних по одній чи більше колонках.

Трохи теорії щодо оператора GROUP BY та HAVING


   Оператор GROUP BY, який визначає підмножину значень окремого поля в термінах іншого поля та дозволяє застосовувати агрегатні функції до отриманної підмножини. Це надає можливість комбінувати поля та агрегатні функції в одному операторі SELECT. GROUP BY використовує агрегатні функції окремо до кожної серії груп, які визначаються загальним значенням поля. Це означає, що поле, до якого застосовується GROUP BY по визначенню має на виході лише одне значення на кожну з груп, що відповідає застосуванню агрегатних функцій. Таке сполучання результатів дозволяє комбінувати агрегати з полями вказанним способом.

    Оператор HAVING призначений для використання спільно з оператором GROUP BY для завдання обмежень, які вказані з метою відбору тих груп, які будуть розміщені в підсумковій таблиці запиту. Хоча оператори HAVING та WHERE мають схожий синтаксис, їх призначення відрізняються. Оператор WHERE призначений для фільтрації окремих рядків, які використовуються для групування або які розміщуються в підсумковій таблиці запита, тоді як оператор HAVING використовується для фільтрації груп, які розміщуються в підсумковій таблиці запита. Стандарт ISO вимагає, щоб імена стовпців, які використовуються в операторі HAVING, обов’язково були присутніми в списку оператора GROUP BY або використовувались в агрегатних функціях.

    На практиці умови пошуку в операторі HAVING завжди містять хоча б одну агрегатну функцію, в протилежному випадку ці умови пошуку повинні бути розміщені в операторі WHERE та використовуватися для відбору окремих рядків. Треба пам’ятати, що агрегатні функції не можуть використовуватися в операторі WHERE. Оператор HAVING не є необхідною частиною SQL – будь-який запит, написаний з використанням оператору HAVING, може бути зображений в іншому вигляді без його використання.

   Варто відмітити порядок опрацювання виразу SELECT:
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY

    Цей порядок дещо не відповідає синтаксичному порядку загального виразу SELECT ;

SELECT
[FROM table_references]
[WHERE where_condition]
[GROUP BY]
[HAVING where_condition]
[ORDER BY]
[LIMIT ]

    Оператор HAVING може використовуватись і без опратора GROUP BY. В такому випадку агрегатні функції застосовуються до всього результуючого набору рядків запиту.

Синтаксис SQL-функції GROUP BY

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

Розглянемо слідуючу таблицю Бази Даних.
Таблиця "Orders"(замовлення).

IDCustomerIDEmployeeIDOrderDateShipperID
102489051996-07-043
102498161996-07-051
102503441996-07-082

Таблиця "Shippers"(вантажовідправники).

rIDShipperNamePhone
1Speedy Express555-9831
2United Package555-3199
3Federal Shipping555-9931

Таблиця "Employees"(співробітники).

EmployeeIDLastNameFirstNameNotes
1DavolioNancyEducation includes....
2FullerAndrewAndrew received..
3LeverlingJanetJanet has...



Приклад використання SQL-виразу GROUP BY

Тепер ми хочемо знайти кількість замовлень відправлених кожним вантажовідправником. Слідуючий SQL-вираз рахує кількість замовлень відсортированих за групою вантажовідправники (ShipperName).

SELECT Shippers.ShipperName,COUNT(Orders.ID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers
ON Orders.ShipperID=Shippers.ShipperID
GROUP BY ShipperName;

Перевір себе тут



Приклад використання SQL-виразу GROUP BY з групуванням даних більше ніж одна колонка

Прикладом SQL-виразу GROUP BY за декількома колонками може бути такий варіант:

SELECT Shippers.ShipperName, Employees.LastName,
COUNT(Orders.OrderID) AS NumberOfOrders
FROM ((Orders
INNER JOIN Shippers
ON Orders.ShipperID=Shippers.ShipperID)
INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID)
GROUP BY ShipperName,LastName;

Перевір себе тут