이동평균 구하는 간단한 예제 부탁드립니다(질문수정). 0 2 4,264

by 분석함수 [SQL Query] [2012.04.06 16:35:44]


테이블은 
WITH T1 AS(--매입
SELECT 'A001' AS GDS_NO,'2012-05-01' AS DTE, 50 AS QTY, 180 AS BUY_PRIC FROM DUAL UNION ALL
SELECT 'A001' AS GDS_NO,'2012-05-10' AS DTE, 100 AS QTY, 200 AS BUY_PRIC FROM DUAL UNION ALL
SELECT 'A001' AS GDS_NO,'2012-05-20' AS DTE, 150 AS QTY, 220 AS BUY_PRIC FROM DUAL 
),
T2 AS (--매출
SELECT 'A001' AS GDS_NO,'2012-05-11' AS DTE, 100 AS QTY FROM DUAL UNION ALL
SELECT 'A001' AS GDS_NO,'2012-05-21' AS DTE, 100 AS QTY FROM DUAL
)
입니다.

5/11 의 매출시 의 이동평균은 그전까지의 매입 평균입니다.
((50*180)+(100*200)) / 150 = 193.3 
이때의 매출원가는 193.3*100 = 19330 

5/21 의 매출시 의 이동평균은 전 이동평균인 193.3을 가지고 다시 매입평균을 냅니다.
((50*193.3)+(150*220)) / 200 = 213.3
이때의 매출원가는 213.3*100 = 21330 

입니다.

이런식의 계산으로 구했으면 하는데 방법이 없을까요?
여러가지로 머리를 굴려봤지만 간단하게 나오지 않네요 
고수님들의 조언 부탁 드립니다. 
아니면 제가 참고 할 수 있는 URL 이라도 보내주시면 감사드리겠습니다.

이런식으로 나왔으면 좋겠습니다. ㅠㅠ 

비고 수량 구입가 매출원가 매출원가금액 재고수량 재고액
5/1 매입 50 180 180.0 50 9000
5/10 매입 100 200 193.3 150 29000
5/11 매출 100 193.3 19330 50 9665
5/20 매입 150 220 213.3 200 42665
5/21 매출 100 213.3 21330 100 21330
by 마농 [2013.07.01 09:48:10]
WITH t1 AS
(--매입
SELECT 'A001' gds_no, '2012-05-01' dte, 50 qty, 180 buy_pric FROM dual
UNION ALL SELECT 'A001', '2012-05-10', 100, 200 FROM dual
UNION ALL SELECT 'A001', '2012-05-20', 150, 220 FROM dual
)
, t2 AS
(--매출
SELECT 'A001' gds_no, '2012-05-11' dte, 100 qty FROM dual
UNION ALL SELECT 'A001', '2012-05-21', 100 FROM dual
)
, t3 AS
(
SELECT gds_no, dte, '매입' gb, qty, buy_pric
  FROM t1
 UNION ALL
SELECT gds_no, dte, '매출', qty, 0
  FROM t2
)
SELECT *
  FROM t3
 MODEL
 PARTITION BY (gds_no)
 DIMENSION BY (ROW_NUMBER() OVER(PARTITION BY gds_no ORDER BY dte) rn)
 MEASURES (dte, gb, qty, buy_pric, 0 v1, 0 v2, 0 v3, 0 v4)
 IGNORE NAV
 RULES AUTOMATIC ORDER
 ( v3[ANY] = v3[cv()-1] + DECODE(gb[cv()], '매출', -qty[cv()], qty[cv()])
 , v1[ANY] = ROUND( (buy_pric[cv()] * qty[cv()] + v1[cv()-1] * v3[cv()-1])
                  / DECODE(gb[cv()], '매출', v3[cv()-1], v3[cv()])
                  , 1)
 , v2[ANY] = DECODE(gb[cv()], '매출', v1[cv()] * qty[cv()])
 , v4[ANY] = v1[cv()] * v3[cv()]
 )
;

by 손님 [2013.07.01 17:44:30]
정말 감사요....
문법적 의미는 몰라도 뭘 뜻하는지는 알거 같네요....
대단하심...^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입