Сейчас на сайте
Сейчас на сайте 0 пользователей и 0 гостей.

Использование агрегатных функций в подзапросах

Один тип функций, который автоматически может производить одиночное значение для любого числа строк, конечно же, - агрегатная функция.

Любой запрос, использующий одиночную функцию агрегата без предложения GROUP BY будет выбирать одиночное значение для использования в основном предикате. Например, вы хотите увидеть все порядки имеющие сумму приобретений выше средней на 4-е Октября ( вывод показан на Рисунке 10.3 ):

SELECT * FROM Orders WHERE amt > ( SELECT AVG (amt) FROM Orders WHERE odate = 10/04/1990 );

SQL Execution Log

SELECT *

FROM Orders

ORDER BY cnum DESC;

onum amt odate cnum snum
3006 1098.16 10/03/1990 2008 1007
3002 1900.10 10/03/1990 2007 1004
3008 4723.00 10/05/1990 2006 1001
3011 9891.88 10/06/1990 2006 1001
30010 1309.95 10/06/1990 2004 1002
3005 5160.45 10/03/1990 2003 1002
3009 1713.23 10/04/1990 2002 1003

Рисунок 10.3: Выбор всех сумм со значением выше средней на 10/04/1990 Средняя сумма приобретений на 4 Октября - 1788.98 ( 1713.23 + 75.75) делится пополяам, что в целом равняется = 894.49. Все строки со значением в поле amt выше этого - являются выбранными.

Имейте ввиду, что сгруппированные агрегатные функции, которые являются агрегатными функциями, определенными в терминах предложения GROUP BY, могут производить многочисленные значения. Они, следовательно, не позволительны в подзапросах такого характера. Даже если GROUP BY и HAVING используются таким способом, что только одна группа выводится с помощью подзапроса, команда будет отклонена в принципе. Вы должны использовать одиночную агрегатную функцию с предложением WHERE, что устранит нежелательные группы. Например, следующий запрос который должен найти среднее значение комиссионных продавца в Лондоне -

SELECT AVG (comm) FROM Salespeople GROUP BY city HAVlNG city = "London";

не может использоваться в подзапросе! Во всяком случае это не лучший способ формировать запрос. Другим способом может быть -

SELECT AVG (comm) FROM Salespeople WHERE city = " London ";