ORDER BY product_type_id;
VARIANCE(PRICE)
50.50125
280.8772
.125
7
0
Вы также можете включить вызов агрегатной функции в ORDER BY, как
показано в следующем примере:
□ SELECT VARIANCE(price)
FROM products
GROUP BY product_type_id
ORDER BY VARIANCE(price);
VARIANCE(PRICE)
0.
125
7
50.50125
280.8772
Неправильное использование вызовов агрегатных функций
Если запрос содержит агрегатную функцию и выбирает столбцы, которые
не включены в эту функцию, эти столбцы должны быть помещены во фразу
GROUP BY. Если не сделать это, то вы получите сообщение об ошибке
ORA-00937: not a single-group group function (ORA-00937: групповая функция
более чем для одной группы). Следующий запрос выбирает столбец
product_type_id и AVG(price), но в нем пропущена фраза GROUP BY для столбца
product_type_id:
Использование простых функций 131
□ SQL> SELECT produ ct_type_id, AVG(price)
2 FROM products;
SELECT produ ct_type_id, AVG(price)
*
ERROR a t lin e 1:
0RA-00937: not a s in g le -g ro u p group fu n c tio n
Эта ошибка возникает потому, что база данных не знает, что ей делать
со столбцом product_type_id в результирующем наборе. Подумайте; запрос
пытается использовать агрегатную функцию AVG(), которая оперирует несколькими
строками, но он пытается также получить значения столбца
p rodu ct_type_id для каждой индивидуальной строки. Этого нельзя сделать
одновременно. Поэтому нужно добавить фразу GROUP BY, которая укажет
базе данных, что необходимо сгруппировать несколько строк с одним
и тем же значением product_type_id. Тогда база данных сможет передать
эти сгруппированные строки на вход функции AVG().
Предупреждение Если ваш запрос содержит агрегатную функцию и выбирает столбцы, которые
не включены в эту функцию, эти столбцы должны быть помещены во фразу GROUP BY.
Кроме того, во фразе WHERE нельзя использовать агрегатные функции
для ограничения числа строк. При попытке сделать это вы получите следующее
сообщение об ошибке: ORA-00934: group function is not allowed here.
(ORA-00934: здесь недопустима групповая функция.) Например:
□ SQL> SELECT produ ct_type_id , AVG(price)
2 FROM products
3 WHERE AVG(p rice) > 20
4 GROUP BY product_type_id;
WHERE AVG(price) > 20
★
ERROR at lin e 3:
ORA-00934: group fu n c tio n i s not allowed here
Ошибка возникает потому, что фразу WHERE можно использовать только
для фильтрации отдельных строк, а не групп строк. Для фильтрации групп
строк используется фраза HAVING, с которой вы ознакомитесь далее.
Использование фразы HAVING для фильтрации групп строк
Фраза HAVING используется для фильтрации групп строк. Фраза HAVING помещается
после фразы GROUP BY:
□ SELECT...
FROM...
WHERE
GROUP B Y ...
HAVING...
ORDER B Y ...;
Примечание Фраза GROUP BY может использоваться без фразы HAVING, но HAVING обязательно
должна использоваться в сочетании с GROUP BY.
132 Гпава 4
Например, нужно увидеть типы товара, средняя цена которых превышает
$20. Для этого следует:
■ использовать фразу GROUP BY для группировки строк в блоки с одним
и тем же значением produ ct_type_id,
■ использовать фразу HAVING для ограничения возвращаемых результатов
теми группами, для которых средняя цена превышает $20.
Следующий запрос иллюстрирует применение фраз GROUP BY и HAVING:
□ SELECT product_type_id, AVG(price)
FROM products
GROUP BY product_type_id
HAVING AVG(price) > 20;
PRODUCT_TYPE_ID AVG(PRICE)
В выходные данные вошли только строки, для которых средняя цена
товара превышает $20:
Совместное использование WHERE и GROUP BY
Фразы GROUP BY и WHERE можно использовать вместе в одном запросе. При
этом сначала фраза WHERE отфильтровывает возвращаемые строки, а затем
оставшиеся строки группируются в блоки фразами GROUP BY. В следующем
запросе используются
■ фраза WHERE для фильтрации строк из таблицы products, чтобы оставить
только строки, для которых price меньше $15,
■ фраза GROUP B Y для группировки оставшихся строк по значению столбца
product_type_id
□ SELECT product_type_id, AVG(price)
FROM products
WHERE price < 15
GROUP BY product_type_id
ORDER BY product_type_id;
PRODUCT_TYPE_ID AVG(PRICE)
Совместное использование фраз WHERE, GROUP BY и HAVING
Можно использовать в одном запросе фразы WHERE, GROUP BY и HAVING. В этом
случае сначала фраза WHERE фильтрует строки, затем оставшиеся строки
группируются в блоки фразой GROUP BY и, наконец, полученные группы
строк фильтруются фразой HAVING. В следующем запросе используются
2
24.975
26.22
2
3
4
14.55
13.24
12.99
13.49
Использование простых функций 133
■ фраза WHERE для фильтрации строк таблицы products, чтобы оставить
только строки, для которых price меньше $15,