Sql server 获取所选日期范围内每2天数据的总和
我在Sql Server中有如下表。我需要获取日期范围内的数据,例如-:StartDate='2020-09-01'和EndDate='2020-09-11'。在一个日期范围内获取数据非常简单,但复杂的部分是,我需要在所选日期范围内每隔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
如上图所示,我需要在单栏中总结每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