在SQL中基于两个日期运行求和



我有一个表,它有三列,如图所示。

Ord_dt—下订单的日期。

first_order—下第一个订单的日期。(根据过去52周计算(

cnt_orders-在订单日期下的订单总数。

ORD_DT  first_order cnt_orders
6/19/2020   6/19/2020   2
6/22/2020   6/19/2020   1
10/8/2020   6/19/2020   2
11/20/2020  6/19/2020   1
12/1/2020   6/19/2020   1
2/4/2021    6/19/2020   1
2/12/2021   6/19/2020   1
3/7/2021    6/19/2020   1
3/30/2021   6/19/2020   1
4/7/2021    6/19/2020   1
4/30/2021   6/19/2020   1
5/11/2021   6/19/2020   1
5/31/2021   6/19/2020   2
7/28/2021   10/8/2020   2

最终输出应该是基于First_order Date的类似内容。Running_Sum列是基于first_order的cnt_order的运行总和。在下面的示例中,第3行Ord_dt=第14行中的first_orderd,因此它应该对第14行从第3行到第14行的所有订单求和。

ORD_DT  first_order cnt_orders  Running_sum
6/19/2020   6/19/2020   2          2
6/22/2020   6/19/2020   1          3
10/8/2020   6/19/2020   2          5
11/20/2020  6/19/2020   1          6
12/1/2020   6/19/2020   1          7
2/4/2021    6/19/2020   1          8
2/12/2021   6/19/2020   1          9
3/7/2021    6/19/2020   1          10
3/30/2021   6/19/2020   1          11
4/7/2021    6/19/2020   1          12
4/30/2021   6/19/2020   1          13
5/11/2021   6/19/2020   1          14
5/31/2021   6/19/2020   2          16
7/28/2021   10/8/2020   2          15

我尝试过SUM和Partition,但由于first_order已更改,所以它没有给我正确的最后一行数据。它应该给我15而不是18。

如何在SQL Server中实现这一点?

需要运行总和的示例表

create table t
(ORD_DT date,  first_order date, cnt_orders int);
go
insert into t values
('6/19/2020' ,  '6/19/2020'  , 2),
('6/22/2020' ,  '6/19/2020'  , 1),
('10/8/2020' ,  '6/19/2020'  , 2),
('11/20/2020',  '6/19/2020'  , 1),
('12/1/2020' ,  '6/19/2020'  , 1),
('2/4/2021'  ,  '6/19/2020'  , 1),
('2/12/2021' ,  '6/19/2020'  , 1),
('3/7/2021'  ,  '6/19/2020'  , 1),
('3/30/2021' ,  '6/19/2020'  , 1),
('4/7/2021'  ,  '6/19/2020'  , 1),
('4/30/2021' ,  '6/19/2020'  , 1),
('5/11/2021' ,  '6/19/2020'  , 1),
('5/31/2021' ,  '6/19/2020'  , 2),
('7/28/2021' ,  '10/8/2020'  , 2);
go

select * ,
(select sum(t1.cnt_orders) 
from t t1 
where  t1.ord_dt >= t.first_order and
t1.ord_dt <= t.ORD_DT
) cumsum
from t 
order by ord_dt;
ORD_DT     first_order cnt_orders  cumsum
---------- ----------- ----------- -----------
2020-06-19 2020-06-19  2           2
2020-06-22 2020-06-19  1           3
2020-10-08 2020-06-19  2           5
2020-11-20 2020-06-19  1           6
2020-12-01 2020-06-19  1           7
2021-02-04 2020-06-19  1           8
2021-02-12 2020-06-19  1           9
2021-03-07 2020-06-19  1           10
2021-03-30 2020-06-19  1           11
2021-04-07 2020-06-19  1           12
2021-04-30 2020-06-19  1           13
2021-05-11 2020-06-19  1           14
2021-05-31 2020-06-19  2           16
2021-07-28 2020-10-08  2           15
(14 row(s) affected)

最新更新