递归方法-库存填充

  • 情形:
之前我在电商遇到这么一个情形:库存记录仅记录出库和入库。
现:要每日库存量的记录。
即:要把没有出库入库数据的天条充完整。
 
  • 假设:
解:工厂生产骨牌,那么我要记录每一天的迄今为止生产了多少个骨牌(按:骨牌颜色和骨牌类型分别统计)
  • 首先:生成具有累计个数(即:有异地生产的天数据)数据
     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);
    View Code

     

  • 然后:执行递归,把空余的天数按前面最近天的累计数填充
     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)
    View Code

     

  • 结果:

     

 

 
posted @ 2016-03-31 15:58  C-华仔  阅读(396)  评论(0编辑  收藏  举报