SQL-需要从3个不同日期范围的单个总和表返回
我有一个账户交易表,包括ID、金额、日期。基本上,我想创建一个结果表,查看该表并返回三个不同结束日期范围内帐户的总和。然后,我想标记(组合_标记)每个帐户ID,如果该ID的任何和不为零,则标记为1,如果所有和都为0,则标记为0 日期范围1)截止上个月底的最短日期(-1个月)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
日期范围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,