판매율관련 시점 일자조회 쿼리에 대하여 질문드립니다. 0 3 1,068

by 미노~ [SQL Query] [2012.10.18 18:48:16]


안녕하세요.
현재 오라클 10g를 사용하고 있습니다.
업무중 해결이 좀 난해한부분이 있어 질문드립니다.

일단 글이 자꾸 깨지네요. 수정해도 깨지네요..제대로 못올려 죄송합니다.

아래와 같이 제품코드별(CODE) 일자별 입고수량(IN), 출고수량(OUT), 판매수량(SELL)에 대한
테이블이 있다고 가정했을때에 해당 제품코드별 판매율이 50%에 도달했을 시점의 일자(STAND_DT)를
구하고자 합니다.
단, 테이블내의 제품코드에 대한 입고,출고,판매수량은 일자누적데이타가 아니라 일자별에 대한 수불내용입니다.

=======================================
   CODE   STAND_DT   IN    OUT   SELL   
=======================================
  A   20120105     5       1     1   ====>   판매율 =  25%
  A   20120107        3       2     2    ====>   판매율 =  50%
  A   20120105    0       2     2    ====>   판매율 = 100%
  B   20120103        6   0     3   ====>   판매율 =  50%
  B   20120106    0   0      3    ====>   판매율 = 100%
  C   20120101    2   2      0    ====>   판매율 = 0%
  D   20120102    1   0     1    ====>   판매율 = 100%
=======================================


위의 내용과 같은 테이블의 데이타를 아래와 같은 결과를 얻고자 합니다.


결과화면(제품코드별 판매율이 50%이었을때의 시점일자)
=======================================
   CODE   STAND_DT  
=======================================
  A   20120107
  B   20120103
=======================================


관심부탁드립니다.. 감사합니다..^^


   

   
by 마농 [2012.10.19 00:16:25]
-- 제시하신 판매율은 누적 판매율이 아닌 당일 재고 기준 판매율이네요.
-- 따라서 판매율이 50%에 도달했을 시점이란 표현이 이상하네요.
-- 일별 판매율이기 때문에 오르락 내리락 할테니까요?
-- 지속적으로 입출고가 일어난다면? 누적판매율이란게 의미가 없긴 하네요.
-- 어찌 되었든 구하고자 하는 자료가 의미있는 자료로서 역할을 못할 듯 합니다.
-- 일단 당일 재고 기준 판매율이 50%가 되는 첫번째 날짜를 가져오는 쿼리는
WITH t AS
(
SELECT 'A' code, '20120105' stand_dt, 5 in_v, 1 out_v, 1 sell FROM dual
UNION ALL SELECT 'A', '20120107', 3, 2, 2 FROM dual
UNION ALL SELECT 'A', '20120108', 0, 2, 2 FROM dual
UNION ALL SELECT 'B', '20120103', 6, 0, 3 FROM dual
UNION ALL SELECT 'B', '20120106', 0, 0, 3 FROM dual
UNION ALL SELECT 'C', '20120101', 2, 2, 0 FROM dual
UNION ALL SELECT 'D', '20120102', 1, 0, 1 FROM dual
)
SELECT code
     , MIN(stand_dt) dt
  FROM (SELECT code, stand_dt, sell
             , SUM(in_v - out_v) OVER(PARTITION BY code ORDER BY stand_dt) jego
          FROM t
        )
 WHERE sell / NULLIF(jego, 0) >= 0.5
 GROUP BY code
 ORDER BY code
;

by 제로 [2012.10.19 12:47:25]
 
-- 근데 위의 샘플 데이터 예제가 맞는건가요?
-- stand_dt, out_v 값을 일부 수정되어야 하는건 아닌지 궁금하네요...
-- UNION ALL SELECT 'A', '20120108', 0, 0, 2 FROM dual 이 부분 수정
WITH t AS
(
SELECT 'A' code, '20120105' stand_dt, 5 in_v, 1 out_v, 1 sell FROM dual
UNION ALL SELECT 'A', '20120107', 3, 2, 2 FROM dual
UNION ALL SELECT 'A', '20120108', 0, 0, 2 FROM dual
UNION ALL SELECT 'B', '20120103', 6, 0, 3 FROM dual
UNION ALL SELECT 'B', '20120106', 0, 0, 3 FROM dual
UNION ALL SELECT 'C', '20120101', 2, 2, 0 FROM dual
UNION ALL SELECT 'D', '20120102', 1, 0, 1 FROM dual
)
select code, stand_dt
from (select code, stand_dt, in_v, out_v, sell
      , jego
      , nvl(sell/nullif(sell+jego, 0), 0) * 100 as per
   from t
   model
   partition by (code)
   dimension by (rownum rn)
   measures (stand_dt, in_v, out_v, sell, 0 jego) ignore nav
   rules 
   ( jego[any] = jego[cv()-1] + (in_v[cv()]-out_v[cv()]-sell[cv()])
   )
   order by code, stand_dt)
where per = 50;

by 미노~ [2012.10.19 19:31:15]

오늘 접속이 늦어 이제야 확인했습니다.

우선 질의에 답변주신분들께 감사드립니다.

어제 급하게 올려서 다시한번 제 질의를 보니 틀리게 올린듯합니다.

답변을 주셨는데 잘못된 내용의 질의를 올려 죄송합니다.

다시한번 명확하게 수정하여 올리드록 하겠습니다...감사합니다..^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입