SQL获取满足提款标准的未偿余额总额

标签 sql postgresql aggregate-functions

我有一个付款表,其中包含 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/

相关文章:

mysql - 存储过程中的 while 循环仅循环两次而不是 8 次

sql - 在 sql server 2008 中使用 distinct 和 sum

sql - 检查数据是否包含同一字符的多个实例

postgresql - 合并 POstgreSQL 9.1 hstore 列中的现有列

java - 我应该避免使用从 Java 8 开始的迭代器吗?它们还有适当的用途吗?

sql - 通过一次选择计算每天的访问量

c# - EntityFramework Group by 不包含在 SQL 语句中

postgresql - 如何从 PostgreSQL 返回多个引用游标?

postgresql - 将删除替换为触发函数 : how to return affected row count?

python - 在某些条件下从数据框中删除重复项