SQL实现两日期区间WHILE LOOP逻辑代码报错排查求助
SQL循环逻辑错误排查与修正
错误点汇总
- 循环条件逻辑颠倒:初始
@FechaMin(2020-09-28)小于@FechaMax(2021-05-17),原条件@FechaMin >= @FechaMax会导致循环完全不执行,需改为@FechaMin <= @FechaMax - 临时表重复创建报错:
SELECT INTO会自动创建临时表,第一次循环执行后#Mov已存在,后续循环执行会抛出对象已存在的错误,需提前创建临时表,循环内改用INSERT INTO写入数据 - 语法冗余错误:GROUP BY语句末尾多了多余的右括号
),属于语法错误 - 缺少循环步进逻辑:循环内没有更新
@FechaMin的代码,会导致死循环,需按实际统计周期(如按天)每次循环后递增@FechaMin - 日期范围逻辑问题:原代码过滤条件
Id_Fec_Diaria >= @FechaMin and Id_Fec_Diaria < @FechaMax会每次取整个区间的数据,和逐段统计的循环预期不符,需根据实际需求调整为对应周期的过滤逻辑
修正后完整代码
以下为按天逐天统计、结果汇总到#Mov表的实现代码,你可根据实际统计周期(周/月等)调整DATEADD参数和日期过滤逻辑:
-- 提前创建临时表,字段类型可根据实际表结构调整 CREATE TABLE #Mov ( Suc INT, SKU VARCHAR(100), TipoMov INT, Prov VARCHAR(100), Uni INT, Imp_Vta DECIMAL(18,2) ) DECLARE @FechaMin DATE='2020-09-28', @FechaMax DATE='2021-05-17'; WHILE (@FechaMin <= @FechaMax) BEGIN INSERT INTO #Mov (Suc, SKU, TipoMov, Prov, Uni, Imp_Vta) SELECT Suc, SKU, TipoMov, Prov, SUM(Uni) as Uni, SUM(Imp_Vta) as Imp_Vta FROM dual WHERE (Mes BETWEEN 22009 AND 22105) AND Suc = 11 AND TipoMov IN (4,5,8) AND Id_Fec_Diaria = @FechaMin GROUP BY Suc, SKU, TipoMov, Prov -- 循环步进:每次加1天,按其他周期统计可修改DATEADD的第一个参数 SET @FechaMin = DATEADD(DAY, 1, @FechaMin) END -- 验证统计结果 SELECT * FROM #Mov
内容的提问来源于stack exchange,提问作者Ren Cantu
相关产品推荐
相关产品推荐

