我正在尝试从历史库存记录中创建库存移动文件,请参见图片:
我已经能够获得绿色动作和橙色值(有一些运气联盟全部为max(day) + 1
的0股票记录,并删除了比今天更少的东西)。然后使用滞后函数生成运动。
困难在于没有0股票记录。即上例中的第五行没有记录,因此无法使用-2创建正确的移动到0。它会产生-10,-4,-4,5,-3,-1,-3
的运动有没有更简单的方法来识别差距并创建幻影0,我知道日期(这些是每周一次的混合日期)?
答案 0 :(得分:0)
在这种情况下,有几种方法可以找到缺失的空白,看起来每周(或7天)都有一个日期,在某些情况下没有日期。因此,您可以使用while循环构建日期表,并在表中为null时执行连接并将Stock Opening Balance分配为0。这是类似的东西,我正在使用表变量,但使用临时表可能会更好,如果你这样做,你不需要2个表只需将缺失插入你的临时表。
DECLARE @TableWithGaps AS TABLE ([Date] DATE, StockOpeningBalance INT)
INSERT INTO @TableWithGaps ([Date],StockOpeningBalance)
VALUES ('2016-04-04',10)
,('2016-04-11',6)
,('2016-04-18',2)
,('2016-05-09',7)
,('2016-05-16',4)
,('2016-05-23',3)
DECLARE @Dates AS TABLE ([Date] DATE)
DECLARE @MinDate DATE = '3/28/2016'
DECLARE @MaxDate DATE = '6/20/2016'
--Could also get first record as minimum date and last record, or set @maxdate = GETDATE()
--SELECT @MinDate = DATEADD(DAY,7,MIN([Date])), @MaxDate = MAX([Date]) FROM @TableWithGaps
WHILE @MinDate < DATEADD(DAY,1,@MaxDate)
BEGIN
INSERT INTO @Dates ([Date]) VALUES (@MinDate)
SET @MinDate = DATEADD(DAY,7,@MinDate)
END
SELECT
d.[Date]
,StockOpeningBalance = ISNULL(StockOpeningBalance,0)
,LAG(ISNULL(StockOpeningBalance,0),1,0) OVER (ORDER BY d.[Date])
,Movements = ISNULL(StockOpeningBalance,0) - LAG(ISNULL(StockOpeningBalance,0),1,0) OVER (ORDER BY d.[Date])
FROM
@Dates d
LEFT JOIN @TableWithGaps s
ON d.[Date] = s.[Date]
另请注意,我更喜欢临时表而不是表变量,并且临时表对于更大的数据集会更好。如果您开始使用日期,您可能需要查看日期维度表,以达到这样的目的。如果您使用的是Microsoft SSAS,它有一个内置工具可以生成一个可以快速搜索/搜索的工具。