Изучаем sql



Pdf көрінісі
бет147/261
Дата28.07.2022
өлшемі1,6 Mb.
#147825
1   ...   143   144   145   146   147   148   149   150   ...   261
Байланысты:
Изучаем SQL ( PDFDrive )


Глава 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> 


Достарыңызбен бөлісу:
1   ...   143   144   145   146   147   148   149   150   ...   261




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет