출고수량 계산 SQL 0 3 2,170

by XX큰타이거 [2014.10.20 12:55:34]


아래와 같이 데이터가 있습니다.

매장 상품코드 요청수량 현 창고재고
A 10 20
A 5 20
A 3 20
A 7 20
A 2 20
B 5 3
B 1 3
B 2 3
B 2 3

위와 같이 되어 있을때 순차적으로 현재 창고재고에 따라 출고수량을 아래와 같이 배분을 해야 합니다.

매장 상품코드 요청수량 현재고 출고수량
A 10 20 10
A 5 20 5
A 3 20 3
A 7 20 2
A 2 20 0
B 5 3 3
B 1 3 0
B 2 3 0
B 2 3 0

상품단위로 현 창고수량 만큼 순차적으로 요청수량 만큼 매장에 출고를 해줘야 하는 로직이지요...

B 상품처럼 수량이 처음부터 모자라면 모자란 만큼 첫번째 매장에 출고하고 나머지 매장은 0으로 출고가 되는 로직 입니다.

고수님들의 고견 부탁 드립니다.

by jkson [2014.10.20 13:24:13]
with t as
(
select 1 SEQ, '가' loc, 'A' code, 10 req, 20 dep from dual union all
select 2 SEQ,  '나' loc, 'A' code, 5 req, 20 dep from dual union all
select 3 SEQ, '다' loc, 'A' code, 3 req, 20 dep from dual union all
select 4 SEQ, '라' loc, 'A' code, 7 req, 20 dep from dual union all
select 5 SEQ, '마' loc, 'A' code, 2 req, 20 dep from dual union all
select 6 SEQ, '가' loc, 'B' code, 5 req, 3 dep from dual union all
select 7 SEQ, '나' loc, 'B' code, 1 req, 3 dep from dual union all
select 8 SEQ, '다' loc, 'B' code, 2 req, 3 dep from dual union all
select 9 SEQ, '라' loc, 'B' code, 2 req, 3 dep from dual
)
SELECT seq
      ,loc
      ,code
      ,req
      ,dep
      ,CASE WHEN dep >= chul THEN req ELSE CASE WHEN dep - (chul - req) < 0 THEN 0 ELSE dep - (chul - req) END END chul
  FROM (SELECT seq
              ,loc
              ,code
              ,req
              ,dep
              ,SUM(req) OVER (PARTITION BY code ORDER BY seq ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) chul
          FROM t)

 

이게 맞나 모르겠네요.


by XX큰타이거 [2014.10.20 16:14:36]

아....결국 산수 문제였네요...ㅋ

ㅡ,.ㅡ;

요청수량을 누적으로 집계 갖고오고 까지 했는데 결국 현재고와 누적요청 수량, 요청수량을 어떻게 계산하는냐가 관건이였네요....

감사합니다. 덕분에 해결했습니다. 

복받으세요....^^


by 아발란체 [2014.10.20 13:37:21]
WITH T AS (
  SELECT 'A' GN, 10 RE, 20 JE FROM DUAL
  UNION ALL SELECT 'A', 5, 20 FROM DUAL
  UNION ALL SELECT 'A', 3, 20 FROM DUAL
  UNION ALL SELECT 'A', 7, 20 FROM DUAL
  UNION ALL SELECT 'A', 2, 20 FROM DUAL
  UNION ALL SELECT 'B', 5, 3 FROM DUAL
  UNION ALL SELECT 'B', 1, 3 FROM DUAL
  UNION ALL SELECT 'B', 2, 3 FROM DUAL
  UNION ALL SELECT 'B', 2, 3 FROM DUAL
)
SELECT
  GN, RE, JE, JJ,
  CASE WHEN(JJ >= 0)
    THEN RE
    ELSE
      CASE WHEN(RE + JJ > 0)
        THEN RE + JJ
        ELSE 0
      END
  END JJ
FROM (
  SELECT GN, RE, JE, JE - SUM(RE) OVER(PARTITION BY GN ORDER BY ROWNUM) JJ FROM T
)

 

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