2014-02-12 3 views
0

거의 2 년 전에 다음 질문을 올렸고 완벽한 대답을 얻었으나 지금은 재고 부족 기간을 연장해야합니다. 여기에 원래의 질문과 대답 내가 제공 한입니다 :..재고 부족 재고 없음

"나는 재고 때문에 inStock의 및 품절 패턴을 결정해야 내가 항목, 위치, 재고 및 날짜를 ​​표시하는 테이블이

내가보고 싶어 항목/위치가 재고가없고 시간이지나면서 점차적으로 변화하는 패턴이있는 경우 파일에 3 주간의 데이터가 포함되어 있습니다. 항목이 3 주 안에 지속적으로 재고가 있거나 재고가 부족한 경우

인벤토리가 0보다 큰 경우 항목이/위치가 재고가 없거나 인벤토리가 0이거나 부정적인 항목/위치가 재고가 없습니다.

어떤 도움을 주셔서 감사합니다.

샘플 데이터

Item, location, inventory, date 
1243, 10,  2,   3/12/2012 
1243, 10,  0,   3/13/2012 
1243, 10,  -2,   3/14/2012 
1243, 10,  -2,   3/15/2012 
1243, 10,  4,   3/16/2012 

그런 다음 추가 항목, 위치, 재고, 날짜 기록

. "

나는 완벽하게 작동이 답변을 받았다.

SELECT item, 
    location, 
    SUM(CASE WHEN status = 'In Stock' AND prior_status = 'Out of Stock' 
      THEN 1 
      ELSE 0 
     END) moved_to_out_of_stock, 
    SUM(CASE WHEN status = 'Out of Stock' AND prior_status = 'In Stock' 
      THEN 1 
      ELSE 0 
      END) moved_to_in_stock 
    FROM (SELECT item, 
      location, 
      status, 
      lag(status) over (partition by item, location 
            order by dt) prior_status 
     FROM (SELECT item, 
        location, 
        (case when inventory <= 0 
         then 'Out of Stock' 
         else 'In Stock' 
        end) status, 
        dt 
       FROM your_table)) 
    GROUP BY item, location 

을 지금은이 발생할 때마다 '품절'. 많은 일이 있었다 기본적으로 어떻게 항목의 기간을 결정 할 수 있도록하려면 ..

: 주식마다의 아웃 위치가 품절이었다

어떤 도움이 많이 감사합니다

편집 여기에 내가 현재 사용하는 쿼리

select ari.ITEM, x.LOCATION, MOVED_TO_OUT_OF_STOCK, MOVED_TO_IN_STOCK 
from (select item, location, 
SUM(CASE WHEN status = 'In Stock' AND prior_status = 'Out of Stock' 
       THEN 1 
       ELSE 0 
      END) 
moved_to_out_of_stock, 
SUM(CASE WHEN status = 'Out of Stock' AND prior_status = 'In Stock' 
       THEN 1 
       ELSE 0 
      END) 
moved_to_in_stock 
    FROM (select item, location, status, lag(status) 
    over (partition by item, location 
    order by repl_date) prior_status 
    FROM (select item, location,(CASE WHEN (stock_on_hand - demo_stock - non_sellable_qty) <='0'--subtract demo stock and non sellable qty 
    then 'Out of Stock' 
    else 'In Stock' 
    end) 
    status, repl_date 
    from repl_results)) 
    group by item, location) x, active_repl_items ari, 
    (select item, location, min(repl_date) as min_repl_date from repl_results 
    group by item, location)y, 
    (select item, location, repl_date, (STOCK_ON_HAND-DEMO_STOCK-NON_SELLABLE_QTY) AS NET_AVAIL from repl_results) z 
where (x.item = ari.item or x.item = ari.primary_pack_no) --to account for pack_items 
and x.item = y.item and x.item = z.item 
and x.location = y.location and x.location = z.location 
and y.min_repl_date = z.repl_date 
and x.location = ari.location 

답변

0

다음은 문제에 대한 접근 방법입니다. 재고 부족 상태를 찾을 때마다 0/1 플래그를 추가하십시오. 그런 다음이 플래그의 누적 합계를 수행하십시오. 이 누적 합계는 재고 부족 조건을 순서대로 식별합니다. 이 누적 합계를 집계하면 재고가없는 기간의 기간을 알 수 있습니다.

select item, location, ooi_grp, min(dt) as mindt, max(dt) as maxdt, 
     (max(dt) - min(dt) + 1) as duration 
from (select t.*, sum(startooi_flag) over (partition by item, location order by dt) as ooi_grp 
     FROM (SELECT item, location, status, 
        (case when lag(inventory) over (partition by item, location order by dt) > 0 and 
           inventory <= 0 
         then 1 else 0 
        end) as startooi_flag 
      FROM your_table 
      ) t 
    ) t 
where inventory <= 0 
group by item, location; 
+0

고맙습니다. 불행히도, 내 SQL 지식은 내 코드에 귀하의 권고를 넣을 수 없을 정도로 너무 작습니다. 현재 질문에 기존 SQL 코드를 추가했습니다. 추천 코드를 원본에 넣을 수 있습니까? 고마워하고 고통스럽게해서 미안하지만 진심으로 도와 주셔서 감사합니다. – user1318132