SqlServer 使用递归公用表表达式处理数据孤岛问题

完整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

 

运行结果

 

posted @ 2020-09-01 06:54  温故纳新  阅读(179)  评论(0编辑  收藏  举报