OpenU.Ru
Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальные суммы приобретений, значения которых выше 90000. Вы не сможете использовать агрегатную функцию в предложении WHERE (если вы не используете подзапрос, описанный ниже), потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. Это означает, что вы не сможете сделать что-нибудь подобно следующему:
SELECT BNum, MAX(SSum) FROM Sells WHERE MAX(SSum)>90000 GROUP BY BNum
Это будет отклонением от правил SQL. Чтобы увидеть максимальную стоимость приобретений свыше 90000, вы можете использовать предложение HAVING. Предложение HAVING определяет критерии, используемые для удаления определенных групп из вывода после группировки точно также, как предложение WHERE делает это для индивидуальных строк. Правильной командой будет следующая:
SELECT BNum, MAX(SSum) FROM Sells GROUP BY BNum HAVING MAX(SSum)>90000
Bnum | MAX OF SSum |
2 | 192000 |
1 | 100000 |
Аргументы в предложении HAVING следуют тем же самым правилам, что и в предложении SELECT, состоящем из команд, использующих GROUP BY, но они должны иметь одно значение на группу вывода. Следующая команда будет запрещена:
SELECT BNum, SDate, MAX(SSum) FROM Sells GROUP BY BNum, SDate HAVING SDate="17.02.01"
Поле SDate не может быть вызвано предложением HAVING, потому что оно может иметь больше чем одно значение на группу вывода. Чтобы избежать такой ситуации, предложение HAVING должно ссылаться только на агрегаты или все множество полей выбранных GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос:
SELECT BNum, MAX(SSum) FROM Sells WHERE SDate="17.02.01" GROUP BY BNumСодержание