HAVING odate = 10/03/1988;
Поле оdate не может быть вызвано предложением HAVING, потому что оно может иметь ( и действительно имеет ) больше чем одно значение на группу вывода. Чтобы избегать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля выбранные GROUP BY.
Имеется правильный способ сделать вышеупомянутый запрос( вывод показывается в Рисунке 6.8 ):
SELECT snum, MAX (amt)
FROM Orders
WHEREodate = 10/03/1990
GROUP BY snum;
=============== SQL Execution Log ==============
| |
| SELECT snum, odate, MAX (amt) |
| FROM Orders |
| GROUP BY snum, odate; |
| =============================================== |
| snum |
| ------ -------- |
| 1001 767.19 |
| 1002 5160.45 |
| 1014 1900.10 |
| 1007 1098.16 |
| |
================================================
Рисунок 6.8: Максимальное значение суммы приобретений у каждого продавца на 3 Октября
Поскольку поля odate нет, не может быть и выбраных полей, значение этих данных меньше чем в некоторых других примерах.
Вывод должен вероятно включать что-нибудь такое что говорит - " это - самые большие порядки на 3 Октября." В Главе 7, мы покажем как вставлять текст в ваш вывод.
Как и говорилось ранее, HAVING может использовать только аргументы которые имеют одно значение на группу вывода. Практически, ссылки на агрегатные функции - наиболее общие, но и поля выбранные с помощью GROUP BY также допустимы. Например, мы хотим увидеть наибольшие порядки для Serres и Rifkin:
SELECT snum, MAX (amt)
FROM Orders