아래와 같이 데이터가 있습니다.
매장 | 상품코드 | 요청수량 | 현 창고재고 |
가 | 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으로 출고가 되는 로직 입니다.
고수님들의 고견 부탁 드립니다.
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)
이게 맞나 모르겠네요.
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 )