재고 table : tb_aa
이동 table : tb_bb
A 품번 : 칼라 00 재고 10장, 칼라 01 재고 5장
칼라 02 재고 -1장, 칼라 03 재고 -3장, 칼라 04 재고 -3장, 칼라 05 재고 -8장
00칼라 01칼라 합 15장을 02, 03, 04, 05 칼라 마이너스 수량만큼 이동시켜 주려 합니다.
------------------------------
insert into tb_bb
select 'A', '00', 'A', '02', '1'
from tb_AA
-------------------------------
간략히 이동을 시켜주는 쿼리이긴한데 데이터의 양이 방대하여 간편히 처리해야 할것 같습니다
WITH tb_aa AS ( SELECT 'A' item, '00' code, 10 cnt FROM dual UNION ALL SELECT 'A', '01', 5 FROM dual UNION ALL SELECT 'A', '02', -1 FROM dual UNION ALL SELECT 'A', '03', -3 FROM dual UNION ALL SELECT 'A', '04', -3 FROM dual UNION ALL SELECT 'A', '05', -8 FROM dual ) , tmp AS ( SELECT item , code , SIGN(cnt) gb , ABS(cnt) cnt , SUM(ABS(cnt)) OVER(PARTITION BY item, SIGN(cnt) ORDER BY code) s_cnt FROM tb_aa ) SELECT a.item , a.code code_1 , b.code code_2 , LEAST( a.s_cnt - b.s_cnt + b.cnt , b.s_cnt - a.s_cnt + a.cnt , a.cnt , b.cnt ) cnt FROM tmp a , tmp b WHERE a.gb = 1 AND b.gb = -1 AND a.item = b.item AND a.s_cnt > b.s_cnt - b.cnt AND b.s_cnt > a.s_cnt - a.cnt ORDER BY a.item, a.code, b.code ; -- http://gurubee.net/lecture/2837