Sql server 获取所选日期范围内每2天数据的总和

Sql server 获取所选日期范围内每2天数据的总和,sql-server,Sql Server,我在Sql Server中有如下表。我需要获取日期范围内的数据,例如-:StartDate='2020-09-01'和EndDate='2020-09-11'。在一个日期范围内获取数据非常简单,但复杂的部分是,我需要在所选日期范围内每隔2天对中的数据进行求和。 例如-: 如上图所示,我需要在单栏中总结每2天的SKU。有人能帮我查询一下这个结果输出吗 CREATE TABLE #Temp ( Sku Nvarchar(50), OrderDate DateTime, Qu

我在Sql Server中有如下表。我需要获取日期范围内的数据,例如-:StartDate='2020-09-01'和EndDate='2020-09-11'。在一个日期范围内获取数据非常简单,但复杂的部分是,我需要在所选日期范围内每隔2天对中的数据进行求和。 例如-:

如上图所示,我需要在单栏中总结每2天的SKU。有人能帮我查询一下这个结果输出吗

CREATE TABLE #Temp
(
    Sku Nvarchar(50),
    OrderDate DateTime,
    Quantity Int,
)

INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-01 00:00:00.000',2)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-02 00:00:00.000',1)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-03 00:00:00.000',3)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-04 00:00:00.000',4)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-05 00:00:00.000',5)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-06 00:00:00.000',6)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-07 00:00:00.000',2)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-08 00:00:00.000',1)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-09 00:00:00.000',3)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-10 00:00:00.000',1)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#xyz','2020-09-11 00:00:00.000',10)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#abc','2020-09-01 00:00:00.000',1)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#abc','2020-09-02 00:00:00.000',10)
INSERT INTO #Temp(Sku,OrderDate,Quantity)Values('#abc','2020-09-03 00:00:00.000',10)

select * from #Temp
使用
ROW\u NUMBER()
LAG()
窗口功能:

select Sku, Quantity
from (
  select Sku, 
    row_number() over (partition by Sku order by OrderDate) rn,
    Quantity + lag(Quantity) over (partition by Sku order by OrderDate) Quantity
  from #Temp
  where OrderDate between '20200901' and '20200911'
) t
where rn % 2 = 0 
order by Sku, rn;
请参阅。
结果:

使用
row\u number()
窗口函数为每个
Sku
生成序列号。按
(rn-1)/2进行分组<代码>计数(*)=2 < /代码>只考虑那些2行

; with 
cte as
(
    select  *, rn = row_number() over (partition by Sku order by OrderDate)
    from    #Temp
)
select  Sku, sum(Quantity)
from    cte
group by Sku, (rn - 1) / 2
having count(*) = 2
order by Sku , (rn - 1) / 2
如果您希望以CSV格式显示结果,请使用。

类似的内容

;with
string_cte(Sku, OrderDate, Quantity, rn_grp) as(
    select  *, (row_number() over (partition by Sku order by OrderDate)+1)/2
    from    #Temp),
sum_cte(Sku, rn_grp, sum_quantity) as (
    select Sku, rn_grp, sum(quantity) 
    from string_cte
    group by Sku, rn_grp
    having count(*)>1)
select
  Sku, string_agg(sum_quantity, ',') within group (order by rn_grp) SecondDaySumUp
from sum_cte
group by Sku
order by 1 desc;
输出

Sku     SecondDaySumUp
#xyz    3,7,11,3,4
#abc    11

这在第二天的情况下运行良好,但如果我们改变第3天或第1天,它不会产生欲望输出。谢谢ridiculous@SteveC你这是什么意思?
Sku     SecondDaySumUp
#xyz    3,7,11,3,4
#abc    11