递归方法-库存填充
- 情形:
之前我在电商遇到这么一个情形:库存记录仅记录出库和入库。现:要每日库存量的记录。即:要把没有出库入库数据的天条充完整。
- 假设:
解:工厂生产骨牌,那么我要记录每一天的迄今为止生产了多少个骨牌(按:骨牌颜色和骨牌类型分别统计)
- 首先:生成具有累计个数(即:有异地生产的天数据)数据
1 IF EXISTS (SELECT 1 FROM tempdb.dbo.SysObjects WHERE ID = OBJECT_ID(N'tempdb..#生产统计') AND TYPE = 'U') 2 DROP TABLE #生产统计; 3 4 WITH DayCount AS( 5 SELECT 生产日期 6 ,骨牌颜色 7 ,骨牌类型 8 ,COUNT(1) AS 生产个数 9 FROM [TEST].[dbo].[骨牌存储箱] WITH(PAGLOCK) 10 WHERE 1+1=2 11 GROUP BY 生产日期,骨牌颜色,骨牌类型 12 ) 13 ,NumberCount AS( 14 SELECT C1.* 15 ,NowCount.Number AS 累计个数 16 FROM DayCount C1 17 OUTER APPLY ( 18 SELECT COUNT(1) AS Number 19 FROM [TEST].[dbo].[骨牌存储箱] WITH(PAGLOCK) 20 WHERE C1.骨牌颜色 = 骨牌颜色 AND C1.骨牌类型 = 骨牌类型 AND C1.生产日期 >= 生产日期 21 )NowCount 22 WHERE 1+1=2 23 ) 24 SELECT DENSE_RANK()OVER(ORDER BY 骨牌类型,骨牌颜色) AS LogoID,NC.* 25 INTO #生产统计 26 FROM NumberCount NC 27 CREATE CLUSTERED INDEX PK_LogoID ON #生产统计(LogoID);
- 然后:执行递归,把空余的天数按前面最近天的累计数填充
1 WITH Start AS( 2 SELECT LogoID,生产日期,骨牌颜色,骨牌类型,生产个数,累计个数 3 FROM #生产统计 4 5 UNION ALL 6 7 SELECT LogoID,DATEADD(DAY,1,生产日期),骨牌颜色,骨牌类型,生产个数,累计个数 8 FROM Start 9 WHERE 1+1=2 AND 生产日期 <= '2015-12-31' 10 AND NOT EXISTS(SELECT 1 FROM #生产统计 WHERE LogoID = Start.LogoID AND 生产日期 = DATEADD(DAY,1,Start.生产日期)) 11 ) 12 SELECT * 13 FROM Start 14 ORDER BY LogoID,生产日期 15 OPTION(MAXRECURSION 0)
-
结果: