Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

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

Здравствуйте, подскажите, пожалуйста, почему нельзя так:

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 выполнить такую фильтрацию?

По дате
По рейтингу
Аватар пользователя
Оракул

Ваш запрос не работает, потому что вы пытаетесь использовать агрегатную функцию sum(buy_book.amount) внутри другой агрегатной функции min(). Это недопустимо в SQL.

Вместо этого, вы можете выполнить два запроса: один для получения минимального значения, и другой для получения жанров с этим минимальным значением. Вот пример:

123456789101112131415
 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;