SQL以获取满足取款条件的未付余额总额

SQL以获取满足取款条件的未付余额总额,sql,postgresql,aggregate-functions,Sql,Postgresql,Aggregate Functions,我有一个带有用户id和金额的付款表。用户的最低提款额为5.00美元,并且可以向其支付任意数量的款项。它们的总余额不会存储在任何地方(为了保持简单并避免同步问题),而是通过执行以下查询来查找: SELECT SUM(amount) FROM payment WHERE user_id = 5; 我想找出符合提款要求的所有余额的总和。我希望我能做的是: SELECT SUM(SUM(amount)) FROM payment WHERE sum(amount) &g

我有一个带有用户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;
不幸的是,我得到了错误

错误:WHERE子句中不允许聚合

如何编写此查询?我用的是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
你需要使用

从未听说过有人尝试进行嵌套聚合。我建议您单独使用
语句或使用类似

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

您需要使用HAVING子句

下面将为您提供余额大于5.00的所有用户。然后,您可以在编程语言中循环以获得总平衡。
按sum(amount)>=5.00的用户id从付款组中选择sum(amount)

我想不出一种方法可以将所有内容都整合到一个高效的SQL语句中,但我会继续思考

很抱歉,我想我对你的第2部分也没有答案。

第1部分:聚合,以及
HAVING
子句 在SQL中,
WHERE
子句不支持使用不在子查询或派生表/内联视图中的聚合(即:MIN、MAX、SUM、COUNT等)。此类情况只能在
HAVING
条款中处理:

  SELECT SUM(p.amount) 
    FROM PAYMENT p
GROUP BY p.to_user_id
  HAVING SUM(p.amount) >= 5.00
第2部分: 因为用户只能向其帐户付款,或者相反-您需要获得要加入的用户列表:

   SELECT COALESCE(x.debit, 0) - COALESCE(y.credit, 0) AS balance
     FROM (SELECT a.from_user_id AS user
             FROM PAYMENT a
           UNION 
           SELECT b.to_user_id
             FROM PAYMENT b) z
LEFT JOIN (SELECT t.to_user_id,
                  SUM(t.payment) AS debit
             FROM PAYMENT t
         GROUP BY t.to_user_id) x ON x.to_user_id = z.user
LEFT JOIN (SELECT t.from_user_id,
                  SUM(t.payment) AS credit
             FROM PAYMENT t
         GROUP BY t.from_user_id) y ON y.from_user_id = z.user
    WHERE COALESCE(x.debit, 0) - COALESCE(y.credit, 0) >= 5.00
 GROUP BY z.user

谢谢,这给了我一部分。我仍然不能求和-它说你不能嵌套聚合。有没有办法做到这一点?我从来没有听说有人尝试过嵌套聚合。我建议您分别使用
with
station或类似
select sum(foo)from(select sum(amount)as foo…having…)。你知道怎么做第二部分吗?我不知道如何保持两个sum(amount)的独立性(to_user的一个sum减去from_user的一个sum)谢谢,它可以工作-一个更正:它必须是外部连接,否则从未发送过钱的用户就不会有余额,但否则就太好了。