我有一个付款表,其中包含 user_id 和金额。用户的最低提款额为 5.00 美元,并且可以接受任意数量的付款。他们的总余额不存储在任何地方(为了保持简单并避免同步问题),而是通过执行如下查询找到它:
SELECT SUM(amount)
FROM payment
WHERE user_id = 5;
我想找出所有满足提款要求的余额总计。我希望我能做的是这样的:
SELECT SUM(SUM(amount))
FROM payment
WHERE sum(amount) >= 5.00
GROUP BY user_id;
不幸的是我收到了错误
ERROR: aggregates not allowed in WHERE clause
我该如何编写这个查询?我使用的是 postgres 8.4。
第 2 部分:
我不确定这是否可行,但此付款表还包括用户进行的付款:付款表包括金额、from_user_id 和 to_user_id。这是一个单式记账系统。如果我还可以减去用户所支付的费用,那就太好了。伪sql是:
SELECT (sum of all amounts)
WHERE (sum(amount where to_user_id = 5) - sum(amount where from_user_id = 5)) > 5.00
最佳答案
您需要使用HAVING clause
从未听说有人尝试进行嵌套聚合。我建议您单独执行内部位,使用 with
语句或使用类似
select sum(foo) from (select sum(amount) as foo ...having ...)
我相信您希望在第二部分中看到类似的内容,尽管我可能会猜测。
with a as(
select sum(amount) as credit, from_user from payment group by from_user
), b as (
select sum(amount) as debit, to_user from payment group by to_user
)
-- glossing over any null values with coalesce:
select to_user, coalesce(credit,0) - coalesce(debit,0) -- coalesce users perhaps?
from a outer join b on from_user = to_user
where coalesce(credit,0) - coalesce(debit,0) > limit -- or vice-versa
关于SQL获取满足提款标准的未偿余额总额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6038780/