2012-06-26 90 views
5

這裏有一個有趣的文章,我發現在我的項目有用:先入先出(FIFO)的庫存成本

Set-based Speed Phreakery: The FIFO Stock Inventory SQL Problem

我們用它來跟蹤的軌道運動

庫存表進出我們想象中的庫存倉庫。我們的倉庫最初是空的,然後股票因股票購買(tranCode ='IN')或由於隨後的返回(tranCode ='RET')而進入倉庫,並且當倉庫移出倉庫時它被出售(tranCode ='OUT')。每種類型的庫存都通過ArticleID進行識別。由於某個商品的購買,銷售或退貨,庫存內外的每次庫存移動都會導致一行被添加到庫存表中,由StockID標識列中的值唯一標識,並描述有多少項目被添加或刪除,購買價格,交易日期等。

雖然我正在使用這個在我正在進行的項目上,但我一直堅持如何在每次交易的OUT上獲得價格收費。我需要有這個價值來確定我會向客戶收取多少費用。

  1. 首先增加5個蘋果(各$ 10.00)的股票,共計$ 50.00

  2. 添加3個蘋果(各$ 20.00美元)的股票共有8個蘋果,爲$ 110.00總價

  3. 然後拿出6項(5每$ 10.00 1每$ 20.00美元)$總共70個

  4. 它將離開2個蘋果@每$ 20,總$ 40

  5. 012交易完成後

Here's my current table 
Item transaction code qty  price 
apple IN     5  10.00  
apple IN     3  20.00 
apple OUT     6   

Manual computation for the OUT transaction price (FIFO) 
QTY  price total price 
5  10.00 50.00 
1  20.00 20.00 
TOTAL:6   70.00 

Output of the script: 
Item CurrentItems CurrentValue 
apple 2   40.00 

What I need: 
Item transaction code qty  price CurrentItems CurrentValue 
apple IN     5  10.00 5    50.00 
apple IN     3  20.00 8    110.00 
apple OUT     6    2     40.00 

This too will be OK 
Item transaction code qty  price CurrentItems  
apple IN     5  10.00 0    
apple IN     3  20.00 0     
apple OUT     6   70 

腳本張貼在競爭中獲勝是非常有用的,我希望有人能幫助我如何得到每「OUT」交易

+0

您需要爲每個交易(In,Out,ret)賦予一個唯一的數字,以便您可以知道蘋果的數量和價格。基於此,您可以通過計算(數量*價格)計算總計有多少。 –

+0

股票表中有一個主鍵。它只是我不想爲了簡單而顯示它,我也使用ItemID而不是蘋果。你不能僅僅通過計算(數量*價格)的價格孤單,記得我需要實現FIFO規則。 – samantha07

回答

0

價格如何構建具有表每個產品的每行一行,因此每個蘋果的一行將隨其價格和可用性(未售出/售出)一起插入。
然後您可以選擇前n項,並選擇與您需要的每種產品相關的價格。基本上,您只需創建一個項目隊列,並從隊列的前面(具有最早的插入日期)中刪除那些「未售出」的項目。

+0

謝謝。這正是我的桌子正在做的。也許我沒有明白你的觀點,你能否給我一個例子? – samantha07

0

根據文章,腳本得到的結果是庫存的價值。您需要修改此項,以便不計算所有庫存,只使用前N個項目。

我會建議您使用CASE語句來設置每個'IN'中的物品數量,因爲您知道庫存物品和要取出的物品的數量,因此您可以檢查物品的運行總量。

1

我建議設計你的餐桌如下: 在你的餐桌上添加一個新字段,即qty_out

銷售面前的桌子:

Item transaction code qty  qty_out price 
apple IN     5 0  10.00  
apple IN     3 0  20.00 
apple OUT     6 null 

和銷售的6個項目後的表:

Item transaction code qty  qty_out price 
apple IN     5 5  10.00  
apple IN     3 1  20.00 
apple OUT     6 null 

您可以比較 「數量」 與 「qty_out」(用於交易)找到出價。

0

不能跟蹤每個OUT交易本身,但是你可以通過最後的(除了你要計算)IN或OUT行和它的當前值列和負電流值要算算它。

在這個例子中

StockID ArticleID TranDate TranCode Items Price CurrentItems CurrentValue 
4567  10000  10:45:07 IN   738 245.94    738 181,503.72 
21628 10000  12:05:25 OUT   600      138  33,939.72 
22571 10000  14:39:27 IN   62 199.95    200  46,336.62 
30263 10000  16:14:13 OUT   165      35  6,998.25 
42090 10000  18:18:58 RET   5      40  7,998.00 
53143 10000  20:18:54 IN   500 135.91    540  75,953.00 

用於事務

30263價格將46,336.62 - 6,998.25 = 39,338.37

0

見下面的代碼在TSQL。其基本思路是

  1. 每個銷售行,說數量爲數量,計算運行總銷售額前的當前行,把它Previous_Sold。

  2. 對於步驟1中的每個銷售行,找到所有以前的購買行並計算運行總庫存UP購買,稱之爲Previous_Running_Stock。

  3. 在步驟2買方行,計算

Open_Stock = Previous_Running_Stock - Previous_Sold

Close_stock = Previous_Running_Stock - Previous_Sold - 數量。

  • 篩選,只保留購買行如果
  • open_stock> 0,意思是有足夠的庫存來填補賣出指令

    和close_stock < 0,意思購買行中的庫存全部用完,或者最早(第一行),其中close_stock> = 0,這意味着部分使用該行中的採購。

  • 集合體(的總和產品)價格和數量以獲得在步驟4
  • LIFO成本相信也可以很容易地修改,以LIFO和平均成本太。

    --initial table of trades 
    item  item_trade_order  direction unit_price qty 
    Apple  1     buy  10   100 
    Apple  2     buy  9    150 
    Blueberry 1     buy  5    300 
    Apple  3     sell  12   50 
    Apple  4     buy  11   200 
    Apple  5     sell  10   350 
    Blueberry 2     sell  10   50 
    
    
    --code, using CTE 
    
    
    ; with step1 as 
    (
        select * 
         , coalesce(sum(case direction when 'sell' then 1 else 0 end * qty) over(partition by item order by item_order rows between unbounded preceding and 1 preceding), 0) Previous_Sold 
        from trade 
    ) 
    , step2_3 as 
    (
        select * 
         , Previous_running_stock - Previous_Sold Open_Stock 
         , Previous_running_stock - Previous_Sold - qty Close_Stock 
         , ROW_NUMBER() over(partition by item, item_order order by (case when Previous_running_stock - Previous_Sold - qty < 0 then null else 0 - item_order end) desc) rnk 
        from step1 t1 
        cross apply 
        (
         select item_order batch_order, price batch_prc, qty batch_qty 
          , sum(qty) over(order by item_order rows unbounded preceding) Previous_running_stock 
         from trade 
         where direction = 'buy' 
         and item = t1.item 
         and item_order < t1.item_order 
        ) batch 
        where t1.direction = 'sell' 
    ) 
    , step4 as 
    (
        select * 
        from step2_3 
        where Open_Stock > 0 
        and (Close_Stock < 0 or rnk = 1) 
    ) 
    select item, item_order, direction, AVG(price) prc, AVG(qty) qty 
        , sum(case when Close_Stock > 0 then batch_qty - close_stock else case when open_stock < batch_qty then open_stock else batch_qty end end * Batch_Prc)/nullif(avg(qty), 0) FifoUnitCost 
    from step4 
    group by item, item_order, direction 
    order by item, item_order