선입선출 관련 쿼리 질문 드립니다. 1 7 2,495

by XX큰타이거 [2015.06.04 18:42:26]


입고 Table

입고순번 입고일자 입고수량 입고단가
1 20150101     50 34500
2 20150103     36 35000
3 20150104     51 36000
4 20150115     36 35000
5 20150117     5 35000

출고테이블

출고순번 출고일자 출고수량
1 20150109     30
2 20150110     21
3 20150110     24
4 20150120     24
5 20150123     18
6 20150123     15

 

선입선출 소진 Table

출고번호 출고수량 입고일자 출고일자 소진수량 입고번호 시점재고
1 30 20150101 20150109     30   1        107
2 24 20150101 20150110     20   1         87
2 24 20150101 20150110     4   2         83
3 21 20150103 20150110     21   2         62
4 24 20150103 20150120     11   2         92
4 24 20150104 20150120     13   3         79
5 15 20150104 20150123     15   3         64
6 18 20150104 20150123     18   3         46

이런 식으로 데이터를 출력해야 하는데요...

입고 수량에서 순차적으로 출고수량을 빼서 소진 Table을 만드는 문제 입니다. 

고수님들 의견 바랍니다....

by 마농 [2015.06.05 09:44:10]
WITH t_in AS
(
SELECT 1 no, '20150101' dt, 50 qty, 34500 amt FROM dual
UNION ALL SELECT 2, '20150103', 36, 35000 FROM dual
UNION ALL SELECT 3, '20150104', 51, 36000 FROM dual
UNION ALL SELECT 4, '20150115', 36, 35000 FROM dual
UNION ALL SELECT 5, '20150117',  5, 35000 FROM dual
)
, t_out AS
(
SELECT 1 no, '20150109' dt, 30 qty FROM dual
UNION ALL SELECT 2, '20150110', 24 FROM dual
UNION ALL SELECT 3, '20150110', 21 FROM dual
UNION ALL SELECT 4, '20150120', 24 FROM dual
UNION ALL SELECT 5, '20150123', 15 FROM dual
UNION ALL SELECT 6, '20150123', 18 FROM dual
)
SELECT o.no   AS o_no
     , o.qty  AS o_qty
     , i.dt   AS i_dt
     , o.dt   AS o_dt
     , LEAST( i.qty
            , o.qty
            , i.s_qty - o.s_qty + o.qty
            , o.s_qty - i.s_qty + i.qty
            ) AS qty
     , i.no   AS i_no
     , (SELECT SUM(qty) FROM t_in WHERE dt <= o.dt)
     - SUM(
       LEAST( i.qty
            , o.qty
            , i.s_qty - o.s_qty + o.qty
            , o.s_qty - i.s_qty + i.qty
            )
       ) OVER(ORDER BY i.no, o.no) AS j_qty
  FROM (SELECT no, dt, qty
             , SUM(qty) OVER(ORDER BY no) s_qty
          FROM t_out
        ) o
     , (SELECT no, dt, qty, amt
             , SUM(qty) OVER(ORDER BY no) s_qty
          FROM t_in
        ) i
 WHERE i.s_qty > o.s_qty - o.qty
   AND o.s_qty > i.s_qty - i.qty
 ORDER BY i.no, o.no
;

 


by jkson [2015.06.05 10:47:24]

엄청 어렵게 느껴져서 하다가 포기했는데 간단하게 하셨네요-0-


by XX큰타이거 [2015.06.05 11:19:41]

도대체 마농님 능력의 한계는 어디까지 인가요......ㅎㅎㅎㅎ

이것저것 짱구를 굴려보다가 해당 데이터를 Procesure에서 Loop을 돌면서 처리할까 했는데 데이터량이 많이 Loop 도는게 부담스러웠거든요.....

복받으실 겁니다.... 정말 감사합니다. 


by jkson [2015.06.05 11:44:14]

답변 채택을 왜 저를...;; 


by XX큰타이거 [2015.06.05 12:46:37]

그러게요.....ㅋ

잘못 눌렀네요.....ㅜㅜ

근데 수정을 할 수가 없네요.....


by 초보초보 [2015.07.08 12:44:21]

멋지다 완전 감동!!! 어떻게 저렇게 간단하게 ;;


by 최구라 [2015.08.05 00:55:03]

이야... 재정 형, 아직 현역으로 뛰고 계신거예요?!
보고싶네요..^^ 제대하고 늘 만나고 싶었는데, 연락한 번 주세요~
형 다음메일로 연락처 남겨놓을께요..^^

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