繁体   English   中英

按任一列分组的 SQL 总和

[英]SQL sums grouped by either column

我一直在尝试使用 PostgreSQL 解决以下问题,但到目前为止没有运气。 我有一个表transfers的账号上市汇款:

id | sender | receiver | sum
-----------------------------
1  | 1234   | 2345     | 5.0
2  | 1234   | 9873     | 5.0
3  | 2345   | 7890     | 12.0
4  | 9873   | 7890     | 1.0

还有一个命名的accounts ,包含带有所有者信息的帐户:

account | owner_name
---------------------
1234    | Fred
2345    | Wilma
9873    | Barney
7890    | Betty

因此,使用 PostgreSQL,我需要一个用户名称表,其中总转账金额(任何方向)等于或高于给定阈值(例如 10.0),按owner_name排序。 即 Fred,帐户的所有者。 1234发送了5.0,收到了5.0,所以总数是10.0。 Wilma(账户 2345)收到 5.0,发送 12.0。 Barney 收到 5.0 并发送 1.0,所以他的总数是 6.0。 最后,Betty 什么也没发送,而是收到了 13.0.0。 三个用户:Fred、Wilma 和 Betty 的总分 >= 10.0,所以他们的名字应该按字母顺序返回,我们应该会收到这样的信息:

result
-------
Betty
Fred
Wilma

可以在一个查询中完成吗?

您可以使用横向连接取消旋转,然后聚合:

select v.account, sum(t.sum) as overall
from transfers cross join lateral
     (values (sender), (receiver)
     ) v(account) join
     accounts a
     on a.account = v.account
group by v.account
having sum(t.sum) >= 10.0;

您可以使用 union all 来获取所有交易的数据集,包括发送方和接收方,然后对于 sum(sum)>10 的那些,找到帐户名称。

select 
  (select account a from accounts where a.account=p.id) as name
from (
select sender as p, sum
from transfers
union all
select receiver as p, sum
) 
group by p
having sum(sum)>10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM