【问题标题】:SQL sums grouped by either column任一列的 SQL 总和组
【发布时间】:2020-10-05 21:28:34
【问题描述】:

我一直在尝试使用 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 排序。 即弗雷德,帐号的所有者。 1234发送了5.0,收到了5.0,所以总共是10.0。 Wilma(账户 2345)收到 5.0 并发送 12.0。 Barney 收到 5.0 并发送 1.0,所以他的总数是 6.0。最后,Betty 没有发送任何内容,但收到了 13.0。三个用户:Fred、Wilma 和 Betty 的总人数 >= 10.0,所以他们的姓名应该按字母顺序返回,我们应该收到如下信息:

result
-------
Betty
Fred
Wilma

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

【问题讨论】:

    标签: sql postgresql aggregate-functions


    【解决方案1】:

    您可以使用横向连接进行反透视,然后进行聚合:

    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;
    

    【讨论】:

      【解决方案2】:

      您可以使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 1970-01-01
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多