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에

무엇이를 달성하기 올바른 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

방법을 사용해보십시오. 먼저 모든 상점에 대해 하나의 행이있는 테이블을 작성한 다음 모든 SKU에 대해 하나의 행이있는 테이블을 작성합니다. 그런 다음 모든 reciept에 대해 하나의 행과 모든 감소에 대해 하나의 행이있는 트랜잭션 테이블이 있습니다. 이렇게하면 어떤 시점에 재고 수준이 무엇인지 판단하는 데 필요한 데이터를 얻을 수 있습니다.

다음으로 위 표의 데이터를 조인하는보기를 만들고 날짜의 선택적 매개 변수를 취합니다. 채워지는 경우 해당 날짜의 재고 수준을 알려줍니다. 정확한 날짜를 원하면 날짜 시간을 지정할 수 있습니다.

현재 인벤토리에 대한보기는 다음과 같습니다.

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 서버 엔진이 거의 없기 때문에 나는 Postgres 엔진에서 피들을해야만했다. 그러나이 쿼리의 구문은 SQL Server (SQL:2008 호환 구문)와 동일합니다.

관련 문제