Читайте также: |
|
_> 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> | SELECT product_cd, SUM(avail_balance) prod_balance | |
_> | FROM account | |
_> | WHERE | status = 'ACTIVE' |
_> | GROUP | BY product_cd |
_> | HAVING MIN(avail_balance) >= 1000 | |
_> | AND | MAX(avail_balance) <= 10000; |
Упражнения | |
+____________+______________+ | product_cd | prod_balance | +____________+______________+ | MM | 17045.14 | +____________+______________+ 1 row in set (0.01 sec)
Этот запрос формирует общие остатки для каждого типа счетов, но ус_ ловие фильтрации блока having исключает все группы, минимальный остаток которых меньше 1000 долларов или максимальный остаток которых больше 10 000 долларов.
Дата добавления: 2015-08-17; просмотров: 48 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
FROM account | | | Gt; FROM account |