재고 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
댓글 달아주신 쿼리 변형해서 업무 처리 했습니다.
감사합니다.