쿼리 ㅜ도움좀 부탁합니다. 0 6 710

by 아이린 [SQL Query] [2017.06.12 11:11:07]


예1          
파렛트 로트 재고수량      
P1 L1 15    입수수량 20
P2 L2 15      
P3 L3 15      
결과값          
IN      
P1 L1 15      
P1 L2 5      
#1 L2 10      
#1 L3 10      
#2 L3 5      
OUT      
P1 L1 15      
P2 L2 15      
P3 L3 15      
           
예2          
파렛트 로트 재고수량      
P1 L1 30    입수수량 20
결과값          
IN      
P1 L1 20      
#1 L2 10      
OUT      
P1 L1 30      
           
예3          
파렛트 로트 재고수량      
P1 L1 10   입수수량 20
P2 L1 5      
결과값          
IN      
P1 L1 15      
OUT      
P1  L1 10      
P2 L1 5      

첫번째 예1를 말씀드리면 데이터를 IN, OUT으로 결과값을 만들어서 INSERT할려고 합니다. 

입수 수량의 기준으로 조회를 하면 IN데이터의 처음의 값인 파렛트P1은 빠른순과 입수수량이 20개까지만 조회며 그다음 행부터는 #1, #2로 된부분은 신규로 입수수량 20이면 파렛트1개씩 채번하며 조회 될수있게 데이터가 나오면 되는데

쉽지가 않네요 PL/SQL로 하는중인데 잘 안되네요 ㅠ고수님들 도와주세요

by 마농 [2017.06.12 13:59:26]

IN  의 결과는 테이블의 값을 토대로 20개 단위로 쪼개 놓은 것인 듯 하고
OUT 의 결과는 테이블의 값 그대로 인 듯 하네요? 맞나요?
OUT 은 별도 가공 없이 그냥 뽑으면 되겠네요?


by 아이린 [2017.06.12 14:00:54]

네 OUT그대로 출력하면 되구요 IN값이 20개 단위로 쪼개지는게 해결이 잘안되네요 ㅜ마농님 항상 감사합니다.


by 마농 [2017.06.12 14:03:56]
WITH t AS
(
SELECT 1 test_case, 'P1' pallet, 'L1' lot, 15 stock FROM dual
UNION ALL SELECT 1, 'P2', 'L2', 15 FROM dual
UNION ALL SELECT 1, 'P3', 'L3', 15 FROM dual
UNION ALL SELECT 2, 'P1', 'L1', 30 FROM dual
UNION ALL SELECT 3, 'P1', 'L1', 10 FROM dual
UNION ALL SELECT 3, 'P2', 'L1',  5 FROM dual
)
SELECT test_case
     , 'IN' gb
     , DECODE(lv, 1, 'P'||min_pallet, '#'||(lv - 1)) pallet
     , lot
     , SUM(LEAST( cnt
                , stock
                , lv * cnt - (s_stock - stock)
                , s_stock - (lv -1) * cnt
                ) ) stock
  FROM (SELECT test_case
             , pallet, lot, stock
             , MIN(TO_NUMBER(SUBSTR(pallet, 2))) OVER(PARTITION BY test_case) min_pallet
             , SUM(stock) OVER(PARTITION BY test_case ORDER BY pallet) s_stock
          FROM t
--         WHERE test_case = 1
        )
     , (SELECT 20 cnt, LEVEL lv FROM dual CONNECT BY LEVEL < 99)
 WHERE s_stock - stock < lv * cnt
   AND s_stock > (lv - 1) * cnt
 GROUP BY test_case, lv, min_pallet, lot
 ORDER BY test_case, lv, lot
;

 


by 아이린 [2017.06.12 14:12:00]

마농님 정말 감사합니다^^ 좋은 하루되세요


by 잭키올 [2017.06.13 23:53:57]

로직에 대한 설명 좀 부탁드립니다.. 로직이 매우 궁금합니다..


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