안녕하세요. 쿼리 가끔씩 막힐때 찾아보며 도움 받고 있습니다.
-- 선입선출 문의 드립니다.
-- 컬럼명 : 계좌, 순번, 구분, 수량
-- 구분 : 1:매도/2:매수
WITH T ( acnt, seq, gb, qnt ) (
SELECT '1111', '001', '2', 2 FROM DUAL
UNION ALL SELECT '1111', '002', '2', 2 FROM DUAL
UNION ALL SELECT '1111', '003', '1', 2 FROM DUAL
UNION ALL SELECT '1111', '004', '1', 1 FROM DUAL
UNION ALL SELECT '1111', '005', '1', 5 FROM DUAL -- 질의하는 데이터 입니다.
UNION ALL SELECT '1111', '006', '2', 2 FROM DUAL
UNION ALL SELECT '1111', '007', '2', 2 FROM DUAL
)
SELECT *
FROM T
[기대결과]
계좌 순번(잔고) 구분 수량 청산순번(구분) 처리구분 청산수량
1111 001 2 2 003(1) 청산 2
1111 002 2 2 004(1) 청산 1
1111 002 2 2 005(1) 청산 1 -- 수량배분으로 1건 청산
1111 005 1 4 - 신규 0 -- 005의 잔여수량을 신규 잔고로 생성(행추가)
1111 005 1 4 006(2) 청산 2 -- 청산되는 구분이 달라집니다.(구분의 기준값이 스위치 됩니다)
1111 005 1 4 007(2) 청산 2 -- 최종 청산되어 잔고수량이 0 이 됩니다.
즉, 매도/매수 구분을 기준으로 선입선출 잔고가 정리되다가,
잔고소진 시점에
1. 잔고수량 범위 내에 소진시 - 정상처리
2. 잔고수량 초과건 발생 시 - 소진 후 잔여수량을 신규잔고로 생성(위 처리구분이 신규행)
3. 이후 반대거래로 청산처리( 위에서 신규행 이후 발생건)
이렇게 처리되야 합니다.
초과건 발생한 경우 처리에 실마리도 안 잡혀서 문의드립니다.
감사합니다.