Открытая коллекция знаний

OpenU.Ru

Язык запросов SQL. DML.

Предложение SQL HAVING

Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальные суммы приобретений, значения которых выше 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

Содержание