Я пытаюсь написать один запрос, который будет выбирать всех пользователей на основе их суммы пожертвований из другой таблицы и упорядочивать по сумме их пожертвований. Но я получаю сообщение об ошибке. Я использую postgres, но думаю, то же самое относится и к mysql.
ERROR: aggregate functions are not allowed in WHERE
LINE 8: sum(donations.donation) = 400
^
Таблица пользователи
id | username |
1 Larry Page
2 Sergey Brin
Таблица пожертвования
id | user_id | donation | date
1 1 100 2019-02-12
2 1 200 2019-02-13
3 2 500 2019-01-15
4 1 100 2019-04-10
Вот мой запрос
select
users.username, sum(donations.donation) as donation_sum
from
users
inner join donations
on users.id = donations.user_id
where
sum(donations.donation) = 400
and
donations.date between '2019-01-01' and '2019-12-31'
order by
donation_sum
Я ожидал, что результат будет таким
username | donation_sum
Larry Page 400
Возможный дубликат используйте mysql SUM() в предложении WHERE
Чтобы отфильтровать результаты агрегации, вы должны использовать ключевое слово HAVING
:
select
users.username, sum(donations.donation) as donation_sum
from
users
inner join donations
on users.id = donations.user_id
where
donations.date between '2019-01-01' and '2019-12-31'
group by
users.username
having
sum(donations.donation) = 400
order by
donation_sum
. . . Having
без GROUP BY
?
Правильно, даже не заметил, что его не было в исходном запросе.
. . . Ваш текущий синтаксис по-прежнему недействителен.
Тогда ответьте на вопрос сами и, пожалуйста, вежливо разозлите чужие комментарии ответа
@YogeshSharma: вы можете самостоятельно исправить очевидные опечатки, просто отредактировав ответ
Что он и сделал, изменив заодно все форматирование, поэтому я и откатился.
Есть ли способ сделать это без использования наличия, может быть, с подзапросами?
Есть, но они будут менее эффективны. Почему ты так хочешь?
Используйте
having
для фильтрации агрегированных данных.