안녕하세요.
쿼리를 짜는 도중 도저히 생각이 안나서 문의드립니다ㅠ.ㅠ
아래와 같은 데이터로 next_amt를 추출하는 건데요.
프로시저로 말고 쿼리로 나머지 행들의 값을 한번에 구하는 방법이 있을까요?
WITH t AS
(
SELECT 1 no, 1.17 pct, 100 amt FROM dual
UNION ALL SELECT 2, 1.11, null FROM dual
UNION ALL SELECT 3, 0.83, null FROM dual
UNION ALL SELECT 4, 0.76, null FROM dual
UNION ALL SELECT 5, 0.93, null FROM dual
UNION ALL SELECT 6, 0.78, null FROM dual
)
select
no
, pct
, amt
, lag(amt) over (order by no)*pct as next_amt
from
t
NO | PCT | AMT | NEXT_AMT | NEXT_AMT로 채워질 값 |
1 | 1.17 | 100 | ||
2 | 1.11 | 111 | ||
3 | 0.83 | 92.1(=111*0.83) | ||
4 | 0.76 | 70.0(=92.1*0.76) | ||
5 | 0.93 | 65.1(=70.0*0.93) | ||
6 | 0.78 | 50.8(=65.1*0.78) |
방법을 아시는 분 계시면 답변 부탁드립니다~!
감사합니다.
--재귀 WITH T1 AS ( SELECT 1 NO, 1.17 PCT, 100 AMT FROM DUAL UNION ALL SELECT 2, 1.11, NULL FROM DUAL UNION ALL SELECT 3, 0.83, NULL FROM DUAL UNION ALL SELECT 4, 0.76, NULL FROM DUAL UNION ALL SELECT 5, 0.93, NULL FROM DUAL UNION ALL SELECT 6, 0.78, NULL FROM DUAL ) , T2(NO, PCT, AMT) AS ( SELECT NO, PCT, AMT FROM T1 WHERE NO = 1 UNION ALL SELECT B.NO, B.PCT, ROUND(A.AMT * B.PCT,1) AMT FROM T2 A, T1 B WHERE A.NO + 1 = B.NO ) SELECT * FROM T2
--모델 WITH T1 AS ( SELECT 1 NO, 1.17 PCT, 100 AMT FROM DUAL UNION ALL SELECT 2, 1.11, NULL FROM DUAL UNION ALL SELECT 3, 0.83, NULL FROM DUAL UNION ALL SELECT 4, 0.76, NULL FROM DUAL UNION ALL SELECT 5, 0.93, NULL FROM DUAL UNION ALL SELECT 6, 0.78, NULL FROM DUAL ) SELECT NO, PCT, ROUND(NEXTAMT,1) AMT FROM T1 MODEL DIMENSION BY (NO) MEASURES(PCT, AMT, 0 NEXTAMT) RULES AUTOMATIC ORDER -- 마농님 댓글보고 수정 (NEXTAMT[ANY] = NVL(NEXTAMT[CV()-1] * PCT[CV()],AMT[CV()])) ORDER BY NO
-- 1. Recursive SQL(11G) 사용 -- jkson 님 방법 -- 2. Model 절(10G) 사용. SELECT * FROM t MODEL DIMENSION BY (no) MEASURES (pct, amt) RULES AUTOMATIC ORDER ( amt[no > 1] = ROUND(amt[CV()-1] * pct[CV()], 1) ) ; -- 3. Exp(Sum(Ln(pct))) 를 이용한 누적 곱 계산 활용(8i) SELECT no, pct , ROUND( EXP(SUM(LN(DECODE(no, 1, 1, pct))) OVER(ORDER BY no)) * MIN(amt) OVER() , 1) amt FROM t ; -- 단, 1, 2 번 방법은 절차적 방법으로 순차적으로 반올림 하며 계산하지만 -- 3번 방법은 집합적 방법으로 최종 결과에 반올림 하므로 오차가 있음.