完整Sql语句(可直接运行)
-- SqlServer 使用递归公用表表达式处理数据孤岛问题 --创建测试表 -- 判断临时表 #t 是否存在 if object_id(N'tempdb..#t',N'U') is not null begin drop table #t end go create table #t(orderDate date,itemNo nvarchar(20),num int); insert into #t(orderDate,itemNo,num) values('2020-01-01','t1',1) ,('2020-01-03','t3',3) ,('2020-01-07','t7',7) -- 查询产品最早下单日期和最晚下单日期之间连续的销量情况 declare @maxDate date -- 最晚下单日期 select @maxDate=max(orderDate) from #t -- 连续日期辅助公用表 ; with date_cte as -- 公用表表达式需要使用分号显式终止前一个语句。 ( select min(orderDate) 'orderDate' from #t union all select convert(date,dateadd(day,1,orderDate)) from date_cte where orderDate<@maxDate ) select bb.orderDate ,case when cc.itemNo is null then '' else cc.itemNo end 'itemNo' ,case when cc.num is null then 0 else cc.num end 'num' from date_cte bb left join #t cc on bb.orderDate=cc.orderDate option(maxRecursion 0) -- 允许无限制的递归次数View Code
运行结果