Один тип функций, который автоматически может производить одиночное значение для любого числа строк, конечно же, — агрегатная функция. Любой запрос, использующий одиночную функцию агрегата без предложения GROUP BY, будет выбирать одиночное значение для использования в основном предикате. Например, вы хотите увидеть все Заказы, имеющие сумму приобретений выше средней на 4-е Октября (вывод показан на Рисунке 10.3):
SELECT * FROM Orders WHERE amt > (SELECT AVG (amt) FROM Orders WHERE odate = 10/04/1990);
Для Interbase нужно изменить так:
SELECT * FROM Orders WHERE amt > (SELECT AVG (amt) FROM Orders WHERE odate = CAST('10/04/1990' AS DATE));
Рисунок 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 HAVING city = 'London;
не может использоваться в подзапросе! Во всяком случае, это не лучший способ формировать запрос. Другим способом может быть
SELECT AVG (comm) FROM Salespeople WHERE city = 'London';