【问题标题】:Can someone help me figure out if I'm making a mistake in my query?有人可以帮我弄清楚我的查询是否有误吗?
【发布时间】:2020-09-21 20:25:58
【问题描述】:

我正在尝试创建一个查询,以返回我的数据库中所有的人的姓名,这些人的钱不到最富有的人的一半。 这是我的查询:

  select P1.name 
    from Persons P1 left join 
         AccountOf A1 on A1.person_id = P1.id left join 
         BankAccounts B1 on B1.id = A1.account_id
group by name
  having SUM(B1.balance) < MAX((select SUM(B1.balance) as b
                                  from AccountOf A1 left join 
                                       BankAccounts B1 on B1.id = A1.account_id
                              group by A1.person_id 
                              order by b desc 
                                 LIMIT 1)) * 0.5

这是结果:

+-------+
| name  |
+-------+
| Evert |
+-------+

我在数据库中有以下表格:

+---------+--------+--+
| Persons |        |  |
+---------+--------+--+
| id      | name   |  |
| 11      | Evert  |  |
| 12      | Xavi   |  |
| 13      | Ludwig |  |
| 14      | Ziggy  |  |
+---------+--------+--+
+--------------+---------+
| BankAccounts |         |
+--------------+---------+
| id           | balance |
| 11           | 525000  |
| 12           | 750000  |
| 13           | 1900000 |
| 14           | 1600000 |
+--------------+---------+
+-----------+-----------+------------+
| AccountOf |           |            |
+-----------+-----------+------------+
| id        | person_id | account_id |
| 301       | 11        | 12         |
| 302       | 13        | 12         |
| 303       | 13        | 14         |
| 304       | 14        | 11         |
| 305       | 14        | 13         |
+-----------+-----------+------------+

我在这里缺少什么?我应该在结果中得到两个条目(Evert,Xavi)

【问题讨论】:

    标签: sql sum window-functions


    【解决方案1】:

    我不会以这种方式处理逻辑(我会使用窗口函数)。但是你最终的having 有两个聚合级别。那应该行不通。你想要:

    having SUM(B1.balance) < (select 0.5 * SUM(B1.balance) as b
                              from AccountOf A1 join
                                   BankAccounts B1 on B1.id = A1.account_id
                              group by A1.person_id
                              order by b desc 
                              limit 1
                             )
    

    我还将0.5 移动到子查询中,并将left join 更改为join——这些表需要匹配才能获得余额。

    【讨论】:

      【解决方案2】:

      如果您的 - 未公开,我会推荐窗口函数! - 数据库支持它们。

      您可以只加入和聚合一次,然后使用窗口max() 获得最高余额。然后剩下的就是在外部查询中过滤:

      select *
      fom (
          select p.id, p.name, coalesce(sum(balance), 0) balance,
              max(sum(balance)) over() max_balance 
          from persons p
          left join accountof ao on ao.person_id = p.id
          left join bankaccounts ba on ba.id = ao.account_id
          group by p.id, p.name
      ) t
      where balance > max_balance * 0.5
      

      【讨论】:

        猜你喜欢
        • 2021-02-12
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 2022-12-28
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多