SQL以获取满足取款条件的未付余额总额
我有一个带有用户id和金额的付款表。用户的最低提款额为5.00美元,并且可以向其支付任意数量的款项。它们的总余额不会存储在任何地方(为了保持简单并避免同步问题),而是通过执行以下查询来查找: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
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)谢谢,它可以工作-一个更正:它必须是外部连接,否则从未发送过钱的用户就不会有余额,但否则就太好了。