컬럼간의 수식이 아닌 다른 row에 저장된 자료를 기준으로 수식적용 0 2 2,864

by 손님 수식 [2013.05.21 18:35:57]


- tbl1
ALIAS VALUE
R1 5.7
R2 2.8
R3 3
... ...


- tbl2
ID DATA
V01 R1+R3/3
V02 (R2+R3)*(R1+R3)/5
V03 ...

고객의 요구사항은 tbl1.alias 로 tbl2.DATA 필드에 수식을 구성해서
그 결과를 얻어야 한다는 겁니다.

제약은 계산항목은 무조건 'R'로 시작한다.
나머지 숫자가 필요한 경우는 숫자를 직접 입력하겠다는 건데...
도무지 방법이 생각나질 않네요.
혹시 저 요구를 처리할 방법이 있을까요?
by 마농 [2013.05.22 00:09:09]
-- 테스트용 테이블 생성 --
CREATE TABLE tbl1 AS
SELECT 'R1' alias, 5.7 value FROM dual
UNION ALL SELECT 'R2', 2.8 FROM dual
UNION ALL SELECT 'R3', 3 FROM dual
;

-- Model 절을 이용한 행간 계산 & dbms_xmlgen 을 이용한 동적쿼리 수행
WITH tbl2 AS
(
SELECT 'V01' id, 'R1+R3/3' data FROM dual
UNION ALL SELECT 'V02', '(R2+R3)*(R1+R3)/5' FROM dual
)
SELECT id
     , data
     , TO_NUMBER(
       dbms_xmlgen.getxmltype
       ( 'SELECT v'
       ||'  FROM (SELECT *'
       ||'          FROM tbl1'
       ||'         MODEL'
       ||'         DIMENSION BY (CAST(alias AS VARCHAR2(9)) a)'
       ||'         MEASURES (value v)'
       ||'         RULES (v'||'['''||id||''']='||REGEXP_REPLACE(data, '(R[0-9]+)', 'v[''\1'']')||')'
       ||'        )'
       ||' WHERE a = ''' || id || ''''
       ).Extract('//text()')
       ) v
  FROM tbl2
;

by 야신 [2013.05.22 01:51:01]
약간 번거롭지만 아래와 같은 방법도 사용해도 될것 같습니다.
목표 : data 컬럼의 모양을 함수를 적용한듯하게 만들어 다이나믹 sql 로 만든 함수를 이용. 데이타를 가져온다.

1. tabl1 의 값을 가져오는 함수를 만듬
create or replace function f_get_value(p_input number) return number is
  v_result number;
begin
  select value
    into v_result
    from tbl1
    where alias = p_input;

  return(v_result);
exception
  when others then 
      return null;
end f_get_value;

2. sql 을 실행 할 수 있는 함수를 만들거나 아니면 dbms_xmlgen.getxmltype 을 이용
create or replace function f_sql_result_retun(p_input varchar2) return number is v_result number; begin execute immediate 'select '||p_input || ' from dual' into v_result; return(v_result); exception when others then return null; end f_sql_result_retun; 3.적용 select id , regexp_replace('(R2+R3)*(R1+R3)/5', 'R([0-9]+)','f_get_value(\1)') exam_input_sql , f_sql_result_retun(regexp_replace('(R2+R3)*(R1+R3)/5', 'R([0-9]+)','f_get_value(\1)')) exam1 , f_sql_result_retun(regexp_replace(data, 'R([0-9]+)','f_get_value(\1)')) as data_result from tbl2;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입