我有一个表,它有三列,如图所示。
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)