게시일: Dec 20, 2011 11:14:17 PM
- CV (dimension_column)
RULES 구문의 계산식에서 연산자를 기준으로 오른쪽에서 사용되며 파라미터인 dimension_column에 명시된 컬럼에 대한 각각의 로우값을 반환한다.
select col_term
, col_ori_sal
, col_tax
, col_real_sal
from (select 1 num, '200701' term, 1000000 salary from dual union all
select 2 num, '200702' term, 2000000 salary from dual union all
select 3 num, '200703' term, 1500000 salary from dual union all
select 4 num, '200704' term, 1900000 salary from dual union all
select 5 num, '200705' term, 2300000 salary from dual union all
select 6 num, '200706' term, 3000000 salary from dual )
MODEL
DIMENSION BY ( term col_term )
MEASURES ( salary col_ori_sal
, salary col_tax
, salary col_real_sal )
RULES (
col_tax[ ANY ] = col_tax[ CV(col_term) ] * 0.033
-- col_tax[ ANY ], col_real_sal[ ANY ]는 col_term 컬럼의 값을 참조한다.
-- ANY : 어떤 값이 오든지 모든 값을 가리킨다. 그러므로 col_tax[ ANY ]는 테이블의 모든 로우에 대한 col_term 컬럼을 참조한다.
-- 즉 TAX['200701']에서 TAX['200707']까지를 참조한다.
-- col_tax[ CV(col_term) ] * 0.033 에서의 CV 함수는 현재 값을 참조하게 된다. 즉 다음과 같이 풀어쓸 수 있다.
-- col_tax['200701'] = col_tax['200701'] * 0.033
-- col_tax['200702'] = col_tax['200702'] * 0.033
-- col_tax['200703'] = col_tax['200703'] * 0.033
-- col_tax['200704'] = col_tax['200704'] * 0.033
-- col_tax['200705'] = col_tax['200705'] * 0.033
-- col_tax['200706'] = col_tax['200706'] * 0.033
, col_real_sal[ ANY ] = col_real_sal[ CV(col_term) ] - (col_tax[ CV(col_term) ] * 0.033)
)
order by 1 ;
----------------------------------------------------
COL_TERM COL_ORI_SAL COL_TAX COL_REAL_SAL
----------------------------------------------------
200701 1000000 33000 998911
200702 2000000 66000 1997822
200703 1500000 49500 1498366.5
200704 1900000 62700 1897930.9
200705 2300000 75900 2297495.3
200706 3000000 99000 2996733
----------------------------------------------------
☞ 아래의 예제로 동일한 결과를 얻을 수 있다.
select col_num
, col_term
, col_ori_sal
, col_tax
, col_real_sal
from (select 1 num, '200701' term, 1000000 salary from dual union all
select 2 num, '200702' term, 2000000 salary from dual union all
select 3 num, '200703' term, 1500000 salary from dual union all
select 4 num, '200704' term, 1900000 salary from dual union all
select 5 num, '200705' term, 2300000 salary from dual union all
select 6 num, '200706' term, 3000000 salary from dual )
MODEL
DIMENSION BY ( num col_num ) -- DIMENSION 컬럼을 num로 잡았다.
MEASURES ( term col_term
, salary col_ori_sal
, salary col_tax
, salary col_real_sal )
RULES (
col_tax [ FOR col_num FROM 1 TO 6 INCREMENT 1 ] = col_tax[ CV(col_num) ] * 0.033
, col_real_sal[ FOR col_num FROM 1 TO 6 INCREMENT 1 ] = col_real_sal[ CV(col_num) ] - (col_tax[ CV(col_num) ] * 0.033)
)
order by 1 ;
----------------------------------------------------------------
COL_NUM COL_TERM COL_ORI_SAL COL_TAX COL_REAL_SAL
----------------------------------------------------------------
1 200701 1000000 33000 998911
2 200702 2000000 66000 1997822
3 200703 1500000 49500 1498366.5
4 200704 1900000 62700 1897930.9
5 200705 2300000 75900 2297495.3
6 200706 3000000 99000 2996733
----------------------------------------------------------------