2016-07-18 5 views
-1
SKU STORE DAY INVENTORY(start of day) DEMAND RECEIPTS 
1 x  1 5       10  9 
1 x  2 =5-10+9 

私は、前の日の在庫レベル、需要と供給領収書に基づいて在庫レベルを予測しようとしています。多くのユニークなstore-sku-dayの組み合わせを持つデータベースには十分な堅牢性が必要です。SQL他の行を基準にした場合

など。

UPDATE table 
SET inventory=inventory(prior day)+receipts(prior day)-demand(prior day) 

これは、これを達成するための正しいSQLコードになります何のMicrosoft SQLで

のですか?

+5

ロバスト?堅牢な質問形式を最初に提供できますか? – icbytes

+0

ここにどこに 'どこ? –

+0

どのバージョンのSQL Serverを使用していますか? –

答えて

0

は、次のように私は過去にこれを近づいてきた方法です。この

UPDATE TBL 
SET inventory = (PriviosDay.inventory + PriviosDay.receipts - PriviosDay.demand) 
FROM (SELECT [DAY] + 1, inventory, receipts, demand) AS PriviosDay 
WHERE 
    TBL.[DAY] = PriviosDay.[DAY] 
0

を試してみてください。最初に、すべての店舗ごとに1つの行、次に各スキューごとに1つの行を持つ表が必要です。次に、すべてのレシピに1行、すべての削減に1行のトランザクションテーブルがあります。このようにして、在庫レベルがいつどの時点にあったかを判断するのに必要なデータが得られます。

次に、上記の表のデータを結合するビューを作成し、日付のオプションのパラメータをとります。入力すると、その特定の日の在庫レベルが表示されます。あなたはそれを正確にしたい場合は、datetimeを作ることができます。

現在の広告枠の表示は、次のようになります。コースの在庫システムの

Select I.SKU, Store, Reciepts - Demand TotalInventory 
    From Items I 
    Join Transactions T On T.ItemID = I.ID 
    Join Store S On S. = T.StoreID 
    Where T.Date <= @DateParameter -- This gives endof day, < gives end of previous day. 
    Group By I.SKU, S.Store 

はるかに複雑に得ることができ、これは単なる基本的な例です。

0

ここでは、ウィンドウ関数を使用したソリューションです。指定された店舗の最も古いレコード(最低日のの値)は、在庫の値が正しく設定されていることを前提としています:そこから計算された値を次のすべてのレコードにカスケードする開始点です。その他のすべての在庫値の値は計算で無視されます。

次に、の在庫の値が計算された値と異なる場合にのみ更新されます。したがって、すべてがすでに正しい場合、何も更新されません。

クエリ持っているすべての(領収書から需要)を追加し、ストアの初期在庫を取って、在庫の計算を行い、サブクエリ(CALC)まで、そこにはなく、現在のレコードの日付を含む。

これは、日の順序にギャップがある場合にも機能することに注意してください。

update t 
set inventory = calc.inventory 
from (select sku, 
       first_value(inventory) over (
        partition by store 
        order by day 
        rows unbounded preceding) 
       + sum(receipts-demand) over (
        partition by store 
        order by day 
        rows unbounded preceding) 
       + demand - receipts as inventory 
     from t) as calc 
where t.sku = calc.sku 
and (t.inventory is null or t.inventory <> calc.inventory); 

ここにはSQL fiddleがあります。

SQL Serverエンジンはほとんど使用できないため、Postgresエンジンでフィドルを実行しなければならないことに注意してください。しかし、このクエリの構文はSQL Server(SQL:2008準拠の構文)と同じです。

関連する問題