动态分母

时间:2017-11-20 16:51:44

标签: sql sql-server

由于缺乏更好的术语,我正在寻找一种动态改变分母的方法,以更好地考虑相对于理想库存的库存水平的动态变化。

我无法用语言表达这一点,所以也许一个例子会有所帮助。

假设公司持有特定库存。此库存可能因销售而波动,有时可能会过度供应。通常根据理想的库存水平检查该库存,并且当相对于总值的理想模型与这些库存低于某个水平时,将从供应商处购买部件。即如果当前库存占第1部分的3%,但理想的库存表明我们应该持有第1部分的5%,我们知道我们需要购买更多的第1部分。

非常简单,除非供应商无法提供更多零件。因此,我们当前的库存包含不同数量的1-10部分(理想库存也是如此)。但是,我们当前库存中的两个部件需要更多,但供应商不能再供应。

因为我们不能再订购这些零件,为了计算其他零件的相对库存,我们需要调整缺货零件的价值,使其与理想库存一致。假设我们通过相对于基于美元的库存中所有项目的总价值获取理想库存水平(例如5%)来实现此目的。然后,我们将每个零件的理想库存水平与当前库存水平之间的差异进行区分,并将该值添加到我们现有库存(每个零件)中的缺货项目。该最终值为我们提供了库存中所有项目的调整后总价值,用于确定库存项目以优先购买(对于与我们的供应商库存的物品)。

如下所示,问题在于,基于缺货项目进行的理论调整是基于初始库存值而非调整后库存值计算的分母。因此,将总重量调整为与理想库存水平一致的缺货产品已关闭。

有没有办法动态考虑调整,最终导致那些与理想库存一致的缺货项目的相对权重?

scan()

比较我们当前库存中供应商缺货的那些项目与基于理想库存的调整值的比较结果:

DECLARE @Inventory TABLE
    (PartID VARCHAR(10),
    Quantity FLOAT
    )

DECLARE @JITInventory TABLE
    (PartID VARCHAR(10),
    Quantity FLOAT,
    isOutOfStock BIT
    )

DECLARE @Price TABLE
    (PartID VARCHAR(10),
    Price FLOAT)

Insert Into @Inventory VALUES
    ('Part 1','10'),
    ('Part 2','15'),
    ('Part 3','10'),
    ('Part 4','12'),
    ('Part 5','9'),
    ('Part 6','8'),
    ('Part 7','6'),
    ('Part 8','13'),
    ('Part 9','14'),
    ('Part 10','18')

Insert Into @JITInventory VALUES
    ('Part 1','15000',1),
    ('Part 2','18067',0),
    ('Part 3','6776',0),
    ('Part 4','10000',0),
    ('Part 5','14455',1),
    ('Part 6','4517',0),
    ('Part 7','22586',0),
    ('Part 8','6776',0),
    ('Part 9','994',0),
    ('Part 10','1355',0)

Insert Into @Price VALUES
    ('Part 1','10'),
    ('Part 2','15'),
    ('Part 3','10'),
    ('Part 4','12'),
    ('Part 5','9'),
    ('Part 6','8'),
    ('Part 7','6'),
    ('Part 8','13'),
    ('Part 9','14'),
    ('Part 10','18')        
    ;


--ideal inventory level as percentage of total
SELECT
    jit.partid,
    jit.Quantity,
    p.Price,
    Net=Quantity*Price,
    Wt=(Quantity*Price)/
        SUM(Quantity*Price) OVER(Partition By 1),
    isOutOfStock
Into #JITInv
FROM @JITInventory jit
    join @Price p
    on jit.PartID=p.PartID


--current inventory level
SELECT
    I.partid,
    I.Quantity,
    p.Price,
    Net=Quantity*Price,
    Wt=(Quantity*Price)/
        SUM(Quantity*Price) OVER(Partition By 1)
Into #Inv
FROM @Inventory I
    join @Price p
    on I.PartID=p.PartID

--knowing we can't order more out of stock items from 
--the supplier, adjust the items we can't control 
--to be in line with our ideal inventory by 
--temporarily assuming we're purchasing those items
--to be held at the same weight as the ideal inventory.
--  i.e. take the weight of the parts in the ideal
--  inventory and multiply by the total value
--  of the current inventory to get
--  the value of the part IDs we assume are 
--  in stock so that the weights of other parts
--  aren't impacted.
SELECT
    J.PartID,
    J.Wt*(Select SUM(NET) FROM #Inv) as JITValue,
    I.Net as IValue,
    J.Wt*(Select SUM(NET) FROM #Inv)-I.Net as Adjustment
INTO #InvAdjust
FROM #Inv I
    JOIN #JITInv J
    ON I.PartID=J.PartID
WHERE isOutOfStock=1

然后重新计算所有头寸的价值,假设我们购买了缺货商品以创建基线,然后我们的供应商的剩余库存商品可以优先购买。

PartID  JITValue          IValue    Adjustment
Part 1  208.167374863295    100       108.167374863295
Part 5  180.543564218936    81        99.5435642189359  

0 个答案:

没有答案