Глава 8. Группировка и агрегаты
формирования групп. Этот тип условий фильтрации должен распола
гаться в блоке
having
. Рассмотрим следующий пример:
mysql>
SELECT product_cd, SUM(avail_balance) prod_balance > FROM account > WHERE status = 'ACTIVE' > GROUP BY product_cd > HAVING SUM(avail_balance) >= 10000; +++
| product_cd | prod_balance |
+++
| CD | 19500.00 |
| CHK | 73008.01 |
| MM | 17045.14 |
| SBL | 50000.00 |
+++
4 rows in set (0.00 sec)
В этом запросе два условия фильтрации: одно в блоке
where
(отсеивают
ся неактивные счета), а второе в блоке
having
(отсеиваются счета всех
типов с общим доступным остатком меньше 10 000 долларов). Таким
образом, один из фильтров воздействует на данные
до группировки,
а другой –
после создания групп. Если по ошибке оба фильтра помеще
ны в блок
where
, возникает следующая ошибка:
mysql>
SELECT product_cd, SUM(avail_balance) prod_balance > FROM account > WHERE status = 'ACTIVE' > AND SUM(avail_balance) > 10000 > GROUP BY product_cd; ERROR 1111 (HY000): Invalid use of group function
Данный запрос дал сбой, потому что агрегатную функцию нельзя
включать в блок
where
. Причина в том, что фильтры блока обрабатыва
ются
до выполнения группировки, поэтому серверу еще не доступны
какиелибо действия над группами.
При введении фильтров в запрос, включающий блок
group
by
, не
обходимо тщательно продумать, к чему применяется фильтр –
к необработанным данным (тогда он относится к блоку
where
)
или к сгруппированным данным (в этом случае он относится
к блоку
having
).
Однако в блок
having
можно включить агрегатные функции,
не пере
численные в блоке
select
, как показано ниже:
mysql>