SQL-需要从3个不同日期范围的单个总和表返回

SQL-需要从3个不同日期范围的单个总和表返回,sql,sql-server,join,self-join,Sql,Sql Server,Join,Self Join,我有一个账户交易表,包括ID、金额、日期。基本上,我想创建一个结果表,查看该表并返回三个不同结束日期范围内帐户的总和。然后,我想标记(组合_标记)每个帐户ID,如果该ID的任何和不为零,则标记为1,如果所有和都为0,则标记为0 日期范围1)截止上个月底的最短日期(-1个月) 日期范围2)最短日期至2个月前结束(-2个月) 日期范围3)截至上个月底的最短日期,去年(-13个月) 结果表应该是:ID、SUM_R1、SUM_R2、SUM_R3、Flag_R1、Flag_R2、Flag_R3、Combi

我有一个账户交易表,包括ID、金额、日期。基本上,我想创建一个结果表,查看该表并返回三个不同结束日期范围内帐户的总和。然后,我想标记(组合_标记)每个帐户ID,如果该ID的任何和不为零,则标记为1,如果所有和都为0,则标记为0

日期范围1)截止上个月底的最短日期(-1个月)
日期范围2)最短日期至2个月前结束(-2个月)
日期范围3)截至上个月底的最短日期,去年(-13个月)

结果表应该是:ID、SUM_R1、SUM_R2、SUM_R3、Flag_R1、Flag_R2、Flag_R3、Combined_Flag

示例数据

| ID       | Amount         | Date          |
| -------- | -------------- |-------------- |
| 1        | 20             | 09/01/19      |
| 2        | 40             | 09/01/19      |
| 3        | 0              | 09/01/19      |
| 4        | 0              | 09/01/19      |
| 1        | 10             | 10/01/19      |
| 2        | 0              | 10/01/19      |
| 3        | 0              | 10/01/19      |
| 4        | 0              | 10/01/19      |
| 1        | 15             | 11/01/19      |
| 2        | 40             | 11/01/19      |
| 3        | 0              | 11/01/19      |
| 4        | 0              | 11/01/19      |
| 1        | 20             | 09/01/20      |
| 2        | 40             | 09/01/20      |
| 3        | 0              | 09/01/20      |
| 4        | 50             | 09/01/20      |
| 1        | 10             | 10/01/20      |
| 2        | 0              | 10/01/20      |
| 3        | 0              | 10/01/20      |
| 4        | 65             | 10/01/20      |
| 1        | 15             | 11/01/20      |
| 2        | 40             | 11/01/20      |
| 3        | 0              | 11/01/20      |
| 4        | 0              | 11/01/20      |
预期结果表(使用日期为2020年12月21日)

我遇到的困难是两次基本上自己加入表格。我得到的结果到处都是,但我不确定到底发生了什么。

这就是你想要的吗

select id,
       sum(case when date < datefromparts(year(v.dte), month(v.dte), 1)
                then amount else 0
           end) as sum_r1,
       sum(case when date < dateadd(month, -1, datefromparts(year(v.dte), month(v.dte), 1))
                then amount else 0
           end) as sum_r2,
       sum(case when date < dateadd(month, -13, datefromparts(year(v.dte), month(v.dte), 1))
                then amount else 0
           end) as sum_r3,
       max(case when amount > 0 and date < datefromparts(year(v.dte), month(v.dte), 1)
                then 1 else 0
           end) as flag_r1,
       max(case when amount > 0 and date < dateadd(month, -1, datefromparts(year(v.dte), month(v.dte), 1))
                then 1 else 0
           end) as flag_r2,
       max(case when amount > 0 and date < dateadd(month, -13, datefromparts(year(v.dte), month(v.dte), 1))
                then 1 else 0
           end) as flag_r3
from t cross join
     (values (convert(date, '2020-12-21'))
     ) v(dte)
group by id;

是一个DBFIDLE。

您说您的自连接有问题。你的尝试是什么?为什么不奏效?为什么加入?使用条件聚合和(case..)啊,谢谢你的想法。一个有条件/案例的场景看起来是可行的。该值可以为负值或正值,但不能为0。看起来好像不用“…当金额>0时…”我可以用“…当金额为0时…”对吗?@misterk。如果您关心的是
sum()
,那么您需要重复实际的
sum()
并生成浮点。您也可以使用
abs(sign(sum(case…))
。我不关心sum()是什么,只是它不等于0尝试测试此解决方案,但在交叉联接部分中得到一个错误:“v附近的语法不正确。以前没有使用交叉联接,所以不确定在这里做什么。”。
select id,
       sum(case when date < datefromparts(year(v.dte), month(v.dte), 1)
                then amount else 0
           end) as sum_r1,
       sum(case when date < dateadd(month, -1, datefromparts(year(v.dte), month(v.dte), 1))
                then amount else 0
           end) as sum_r2,
       sum(case when date < dateadd(month, -13, datefromparts(year(v.dte), month(v.dte), 1))
                then amount else 0
           end) as sum_r3,
       max(case when amount > 0 and date < datefromparts(year(v.dte), month(v.dte), 1)
                then 1 else 0
           end) as flag_r1,
       max(case when amount > 0 and date < dateadd(month, -1, datefromparts(year(v.dte), month(v.dte), 1))
                then 1 else 0
           end) as flag_r2,
       max(case when amount > 0 and date < dateadd(month, -13, datefromparts(year(v.dte), month(v.dte), 1))
                then 1 else 0
           end) as flag_r3
from t cross join
     (values (convert(date, '2020-12-21'))
     ) v(dte)
group by id;
   abs(sign(sum(case when amount > 0 and date < datefromparts(year(v.dte), month(v.dte), 1) 
                     then amount else 0 
                end))) as flag_r1,