繁体   English   中英

SQL - 在结果被分组和过滤后,我如何总结一列?

[英]SQL - How can I sum up a column after the results have been grouped and filtered in the having clause?

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

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 语句的最后一行:

and         sum(Deposits.amount) >= 500

包括帐户的所有交易,就好像没有“HAVING”子句一样。 它正在考虑从“HAVING”的第一行中排除的交易:

having      Deposits.transDate between min(Deposits.transDate) and DATEADD('d',30,min(Deposits.transDate))

这是我的数据的样子(不按帐号分组):

accountNumber    amount    sum
123456           $100      $6,500
123456           $50       $6,500
123456           $50       $6,500

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

accountNumber    amount    sum
123456           $100      $200
123456           $50       $200
123456           $50       $200

提前致谢。 我的 DBMS 是系统间缓存。 可以在此处找到指向其参考资料的链接。

你可以尝试这样的事情:

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. 您显示的 3 笔交易都在 30 天窗口内吗? 如果是,则总数少于 500 美元。 因此,应跳过此帐户。 2. 既然$6500 是所有交易的总和大于开放日期,为什么还要计算它? 您只关心 30 天的窗口。

除此之外,我认为断开连接的是 HAVING 子句中的日期计算。 您在 SELECT 中使用 MIN,但在 HAVING 中使用完全不同的聚合日期计算。 我认为您应该将计算从 HAVING 中取出并使其成为 WHERE 的一部分。

当然,一旦你这样做了,你就必须从 SELECT 中取出 MIN。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM