情形: 情形: 之前我在電商遇到這麼一個情形:庫存記錄僅記錄出庫和入庫。 現:要每日庫存量的記錄。 即:要把沒有出庫入庫數據的天條充完整。 假設: 假設: 解:工廠生產骨牌,那麼我要記錄每一天的迄今為止生產了多少個骨牌(按:骨牌顏色和骨牌類型分別統計) 首先:生成具有累計個數(即:有異地生產的天數據 ...
- 情形:
之前我在電商遇到這麼一個情形:庫存記錄僅記錄出庫和入庫。 現:要每日庫存量的記錄。 即:要把沒有出庫入庫數據的天條充完整。
- 假設:
解:工廠生產骨牌,那麼我要記錄每一天的迄今為止生產了多少個骨牌(按:骨牌顏色和骨牌類型分別統計)
- 首先:生成具有累計個數(即:有異地生產的天數據)數據
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 -
結果: