首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -在having子句中对结果进行分组和过滤后,如何对列进行汇总?

SQL -在having子句中对结果进行分组和过滤后,如何对列进行汇总?
EN

Stack Overflow用户
提问于 2017-12-29 06:43:37
回答 2查看 145关注 0票数 1

我现在的问题是:目标是找到在第一次存款后30天内收到至少500美元存款的账户。一些帐户已被关闭并重新打开,因此“WHERE”子句的第一行。

代码语言:javascript
复制
select      Deposits.accountNumber,
            min(Deposits.transDate) as "first deposit",
            Deposits.transDate,
            CAST(DATEADD(d,30,min(Deposits.transDate)) as date) as "30 days",
            sum(Deposits.amount) as "sum",
            Deposits.amount,
            Members.accountOpenDate
from        Deposits
inner join  Members on Deposits.accountNumber = members.accountNumber 
where       Deposits.transDate >= members.accountOpenDate
and         Deposits.accountNumber = 123456
group by    Deposits.accountNumber 
having      Deposits.transDate between min(Deposits.transDate) and DATEADD('d',30,min(Deposits.transDate))
and         sum(Deposits.amount) >= 500

我遇到的问题是HAVING语句的最后一行:

代码语言:javascript
复制
and         sum(Deposits.amount) >= 500

包括帐户的所有事务,就好像没有“HAVING”子句一样。它是在“拥有”的第一行中排除的交易中的保理:

代码语言:javascript
复制
having      Deposits.transDate between min(Deposits.transDate) and DATEADD('d',30,min(Deposits.transDate))

下面是我的数据(不按账号分组):

代码语言:javascript
复制
accountNumber    amount    sum
123456           $100      $6,500
123456           $50       $6,500
123456           $50       $6,500

这就是我想要达到的目标:

代码语言:javascript
复制
accountNumber    amount    sum
123456           $100      $200
123456           $50       $200
123456           $50       $200

提前谢谢。我的DBMS是Intersystems-Cache。他们的参考链接可以在Here上找到。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-29 06:50:23

您可以尝试这样的操作:

代码语言:javascript
复制
select      filtered.accountNumber,
            min(filtered.transDate) as "first deposit",
            filtered.transDate,
            CAST(DATEADD(d,30,min(filtered.transDate)) as date) as "30 days",
            sum(filtered.amount) as "sum",
            filtered.amount,
            filtered.accountOpenDate
from        
(
    select * from Deposits
    inner join  Members on Deposits.accountNumber = members.accountNumber 
    where       Deposits.transDate >= members.accountOpenDate
    and         Deposits.accountNumber = 123456
    having      Deposits.transDate between min(Deposits.transDate) and DATEADD('d',30,min(Deposits.transDate))
) as filtered
group by    filtered.accountNumber 
having sum(filtered.amount) >= 500

对于这样的查询,您首先要应用transDate条件过滤数据,然后可以对金额的和进行过滤

票数 1
EN

Stack Overflow用户

发布于 2017-12-29 10:02:47

我们需要澄清: 1.您显示的3笔交易是否都在30天内?如果是,那么总金额不到500美元。所以,这个账号应该跳过。2.既然6500美元是所有交易的总和,为什么还要计算它?您只关心30天的窗口。

除此之外,我认为断开连接是HAVING子句中的日期计算。您在SELECT中使用MIN,但在HAVING中使用完全不同的聚合日期计算。我认为你应该把计算从拥有中去掉,让它成为WHERE的一部分。

当然,一旦你这样做了,你就必须去掉SELECT中的最小值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48015287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档