码迷,mamicode.com
首页 > 其他好文 > 详细

递归方法-库存填充

时间:2016-03-31 16:32:37      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

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

     

  • 结果:

     技术分享

 

 

递归方法-库存填充

标签:

原文地址:http://www.cnblogs.com/C-1989/p/5341485.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!