ИСПОЛЬЗОВАНИЕ АГРЕГАТНЫХ ФУНКЦИЙ В ПОДЗАПРОСАХ
Один тип функций, который автоматически может производить одиночное значение для
любого числа строк, конечно же, - агрегатная функция. Любой запрос использующий одиночную функцию агрегата
без
предложения GROUP BY будет выбирать одиночное значение для использования в основном предикате. Например,
вы
хотите увидеть все порядки имеющие сумму приобретений выше средней на 4-е Октября ( вывод показан на Рисуноке 10.3 ):
SELECT * FROM Orders WHERE amt > ( SELECT AVG (amt) FROM Orders WHERE odate = 10/04/1990 );
onum |
amt |
odate |
cnum |
snum |
3002 |
1900.10 |
10/03/1990 |
2007 |
1004 |
3005 |
2345.45 |
10/03/1990 |
2003 |
1002 |
3006 |
1098.19 |
10/03/1990 |
2008 |
1007 |
3009 |
1713.23 |
10/04/1990 |
2002 |
1003 |
3008 |
4723.00 |
10/05/1990 |
2006 |
1001 |
3010 |
1309.95 |
10/06/1990 |
2004 |
1002 |
3011 |
9891.88 |
10/06/1990 |
2006 |
1001 |
Рисунок 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";