【问题标题】:Group Using SQL and Keeping Initial Records使用 SQL 分组并保留初始记录
【发布时间】:2017-03-13 21:35:05
【问题描述】:

我正在使用 GROUP BY 和 HAVING 来选择一些符合我们公司计划资格的消费者。我们将此基于消费者从与其关联的任意数量的帐户(一对多)中获得的余额。

下面是代码示例:

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

它不包括那些单独的账户不能满足所需余额但加起来会超过阈值的消费者。

【问题讨论】:

  • 你能发布表模式吗?我们需要知道哪个表拥有每个字段。或者至少在每个字段前面加上它的表名。
  • 没问题:consumer.consumerid,accounts.balanceonacct,accounts.accountid,accounts.consumerid

标签: mysql sql group-by group-concat


【解决方案1】:

您已经拥有一组满足条件的consumerid 值,因此您可以将现有查询用作派生表,然后再次加入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

【讨论】:

  • 谢谢!这样做很简单,以获取消费者 ID,然后在帐户级别加入后重新应用标准。我能够完美地将账户与消费者余额相匹配。
【解决方案2】:

我认为这是你想要的:

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 表,除非您需要该表中的某些特定字段。

【讨论】:

  • 我确实想要该消费者表中的一些细节,但您在此处发布的逻辑正是我解决问题所需要的。感谢您的帮助!
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2020-12-23
  • 2011-12-23
  • 1970-01-01
相关资源
最近更新 更多