使用 SQL 分组并保留初始记录

Group Using SQL and Keeping Initial Records

我正在使用 GROUP BY 并拥有 select 一些有资格参加我们公司计划的消费者。我们基于消费者从与其关联的任意数量的帐户(一对多)中获得的余额。

下面是代码示例:

select   consumerid, 
         sum(balanceonaccts) bal,
         group_concat(accountid) accts
from     accounts
join     consumer 
on       consumer.consumerid = accounts.consumerid 
group by consumerid
having   bal > 300"

这为我提供了有关谁符合消费者级别资格的信息,但是,我能够识别合并满足余额的帐户的唯一方法是使用 group_concat()。

我想知道是否有一种方法可以识别那些账户合计满足余额标准的消费者,然后以某种方式将输出下移到账户级别。

当我尝试:

group by accountid

不包括单独账户达不到要求的余额但总和超过阈值的消费者。

我认为这符合您的要求:

select a.*
from accounts a join
     (select a.consumerid, sum(balanceonaccts) as bal
      from accounts a
      group by a.consumerid
      having bal > 300
     ) aa
     on a.consumerid = aa.consumerid;

我认为您根本不需要 consumers table,除非您希望从 table.

中获得某些特定字段

您已经拥有满足条件的 consumerid 组值,因此您可以将现有查询用作派生的 table 并再次加入 accounts 以获得帐户:

select
    a.consumerid,
    a.accountid,
    a.balanceonaccts,
    ba.bal
from
    accounts a
    inner join (
        select
            ac.consumerid, 
            sum(ac.balanceonaccts) bal
        from
            accounts ac
            inner join consumer co on
                co.consumerid = ac.consumerid 
        group by
            ac.consumerid
        having
            bal > 300
    ) ba on ba.consumerid = a.consumerid
order by
    a.consumerid,
    a.accountid