Скачиваний:
25
Добавлен:
01.04.2014
Размер:
761.34 Кб
Скачать

Предложение having

Предположим, что в предыдущем примере, вы хотели бы увидеть только

максимальную сумму приобретений значение которой выше $3000.00. Вы

не сможете использовать агрегатную функцию в предложении WHERE

( если вы не используете подзапрос, описанный позже ), потому что

предикаты оцениваются в терминах одиночной строки, а агрегатные

70 Понимание sql

______________________________________________________________________

ГЛ. 6

функции оцениваются в терминах групп строк. Это означает что вы не

сможете сделать что-нибудь подобно следующему:

SELECT snum, odate, MAX (amt)

FROM Oreders

WHERE MAX ((amt)) > 3000.00

GROUP BY snum, odate;

Это будет отклонением от строгой интерпретации ANSI. Чтобы увидеть мак-

симальную стоимость приобретений свыше $3000.00, вы можете использо-

вать предложение HAVING.

Предложение HAVING определяет критерии используемые чтобы удалять

определенные группы из вывода, точно также как предложение WHERE

делает это для индивидуальных строк.

Правильной командой будет следующяя:

SELECT snum, odate, MAX ((amt))

FROM Orders

GROUP BY snum, odate

HAVING MAX ((amt)) > 3000.00;

Вывод для этого запроса показывается в Рисунке 6. 7.

=============== SQL Execution Log ==============

| |

| SELECT snum, odate, MAX (amt) |

| FROM Orders |

| GROUP BY snum, odate |

| HAVING MAX (amt) > 3000.00; |

| =============================================== |

| snum odate |

| ------ ---------- -------- |

| 1001 10/05/1990 4723.00 |

| 1001 10/06/1990 9891.88 |

| 1002 10/03/1990 5160.45 |

| |

================================================

Рисунок 6. 7: Удаление групп агрегатных значений

CУММИРОВАНИЕ ДАННЫХ

С ПОМОЩЬЮ АГРЕГАТНЫХ ФУНКЦИЙ 71

______________________________________________________________________

Аргументы в предложении HAVING следуют тем же самым правилам

что и в предложении SELECT, состоящей из команд использующих

GROUP BY. Они должны иметь одно значение на группу вывода.

Следующая команда будет запрещена:

SELECT snum, MAX (amt)

FROM Orders

GROUP BY snum

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 Октября

Соседние файлы в папке ПОНИМАНИЕ SQL