【发布时间】:2021-05-27 04:30:51
【问题描述】:
我的桌子目前是这样的:
+---------+---------------+------------+------------------+
| Segment | Product | Pre_Date | ON_Prepaid |
+---------+---------------+------------+------------------+
| RB | 01. Auto Loan | 2020-01-01 | 10645976180.0000 |
| RB | 01. Auto Loan | 2020-01-02 | 4489547174.0000 |
| RB | 01. Auto Loan | 2020-01-03 | 1853117000.0000 |
| RB | 01. Auto Loan | 2020-01-04 | 9350258448.0000 |
+---------+---------------+------------+------------------+
我正在尝试对 7 天内的“ON_Prepaid”值求和,比如说从“2020-01-01”到“2020-01-07”。 这是我尝试过的
drop table if exists ##Prepay_summary_cash
select *,
[1W_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 1 following and 7 following),
[2W_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 8 following and 14 following),
[3W_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 15 following and 21 following),
[1M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 22 following and 30 following),
[1.5M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 31 following and 45 following),
[2M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 46 following and 60 following),
[3M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 61 following and 90 following),
[6M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 91 following and 181 following)
into ##Prepay_summary_cash
from ##Prepay1
如果日期是连续的,应该没问题;但是,“Pre_Date”中缺少一些日期(您知道银行在周日不工作等)。
所以我正在尝试类似的工作
[1W] = SUM(ON_Prepaid) over (where Pre_date between dateadd(d,1,Pre_date) and dateadd(d,7,Pre_date))
类似的东西。因此,如果本身没有 2020-01-05 的记录,则结果应仅将 2020 年 1 月 1、2、3、4、6、7 的日期相加,而不是 1、2、3、4、6, 7,8(8 因为“第 7 行以下”)。或者例如,我在 30 天之内丢失了记录,那么所有这 30 条记录都应该加起来为 0。所以 45 天应该只返回 15 天的值。 我已经尝试在整个论坛中查找,但答案还不够。你们能帮帮我吗?或者将我链接到问题已经解决的线程。
非常感谢。
【问题讨论】:
-
您是否尝试过条件总和,例如
sum(case when {condition} then value else 0 end)? -
我做到了,总和(当 pre_date 介于 dateadd(d,1,predate) 和 dateadd(d,7,predate) 然后 ON_Prepaid else 0 end) 只返回 0
-
如果您正在查看评估值(而不是 行数),您可能希望让窗口函数使用 RANGE 而不是 ROWS,例如 sqlpassion.at/archive/2015/01/22/…
-
这个条件永远不会满足? 'pre_date' 永远不会在那个范围内
-
还是像
datepart(week)分区一样简单?
标签: sql sql-server tsql sum