Офисы с менее чем 15 заказов за год онлайн урок.


Рассмотрим запрос для получения списка офисов, у которых менее 15 заказов за конкретный год. Например, возьмем 2003 год. Таблица офисов не связана напрямую с таблицей заказов. Для соединения столбцов этих таблиц необходимо соединить таблицы сотрудников и заказчиков дополнительно:

offices of
JOIN workers w ON w.office_id = of.id
JOIN customers c ON c.worker_id = w.id
JOIN orders o ON o.customer_id = c.id

Далее запишем поля для выборки - идентификатор офиса и количество заказов (функция COUNT) и сгруппируем по идентификатору офиса. пере группировкой необходимо указать год, иначе в группах будут учтены все заказы, а не за конкретный год

SELECT of.id AS office_id, count( o.id ) AS orders_count
FROM offices of
JOIN workers w ON w.office_id = of.id
JOIN customers c ON c.worker_id = w.id
JOIN orders o ON o.customer_id = c.id
WHERE year( o.date ) =2003
GROUP BY office_id


+-----------+--------------+
| office_id | orders_count |
+-----------+--------------+
| 1 | 17 |
| 2 | 9 |
| 3 | 14 |
| 4 | 34 |
| 5 | 7 |
| 6 | 12 |
| 7 | 18 |
+-----------+--------------+


Осталось применить оператор HAVING для отбора групп, с количеством заказов меньше 15:

SELECT of.id AS office_id, count( o.id ) AS orders_count
FROM offices of
JOIN workers w ON w.office_id = of.id
JOIN customers c ON c.worker_id = w.id
JOIN orders o ON o.customer_id = c.id
WHERE year( o.date ) =2003
GROUP BY office_id
HAVING count( o.id ) <15


+-----------+--------------+
| office_id | orders_count |
+-----------+--------------+
| 2 | 9 |
| 3 | 14 |
| 5 | 7 |
| 6 | 12 |
+-----------+--------------+