Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

SQL запрос, фильтрация данных с помощью having

mightyvova Ученик (106), на голосовании 11 месяцев назад
Здравствуйте, подскажите, пожалуйста, почему нельзя так:

select name_genre,sum(buy_book.amount) as Количество
from genre
inner join book using(genre_id)
inner join buy_book using(book_id)
group by name_genre
having sum(buy_book.amount)<=min(sum(buy_book.amount))

Условие задачи такое:
Вывести жанр(ы), в котором было заказано меньше всего экземпляров книг, указать это количество. Учитывать только жанры, в которых была заказана хотя бы одна книга.
При реализации в основном запросе не используйте LIMIT, поскольку жанров с минимальным количеством заказанных книг может быть несколько.

Почему нельзя в having выполнить такую фильтрацию?
Голосование за лучший ответ
Sergio 2.1 Оракул (67269) 1 год назад
Ваш запрос не работает, потому что вы пытаетесь использовать агрегатную функцию sum(buy_book.amount) внутри другой агрегатной функции min(). Это недопустимо в SQL.

Вместо этого, вы можете выполнить два запроса: один для получения минимального значения, и другой для получения жанров с этим минимальным значением. Вот пример:
 WITH total AS ( 
SELECT name_genre, SUM(buy_book.amount) as Количество
FROM genre
INNER JOIN book USING(genre_id)
INNER JOIN buy_book USING(book_id)
GROUP BY name_genre
),
min_total AS (
SELECT MIN(Количество) as min_amount
FROM total
)
SELECT name_genre, Количество
FROM total
JOIN min_total ON total.Количество = min_total.min_amount;
mightyvovaУченик (106) 1 год назад
Большое спасибо за пояснение!
Похожие вопросы