이런식으로 항목구분에 따른 항목값이 있는 테이블이 있고 산식이 있는 테이블이 있습니다.
맨밑에 결과 산식변환처럼 결과값이 나와야 합니다ㅠㅠ
산식이 해당 이미지처럼 고정은 아니고 A+B+((C/D) * E) 이런식으로 다양하게 있고 항목구분의 값들과 매칭이 되어야 합니다
정적쿼리로 될까요?
WITH code AS
(
SELECT 'A' cd, 80.7 v FROM dual
UNION ALL SELECT 'B', 79.2 FROM dual
UNION ALL SELECT 'C', 78.0 FROM dual
UNION ALL SELECT 'D', 81.7 FROM dual
UNION ALL SELECT 'E', 71.5 FROM dual
UNION ALL SELECT 'F', 74.7 FROM dual
UNION ALL SELECT 'G', 74.5 FROM dual
UNION ALL SELECT 'H', 74.5 FROM dual
UNION ALL SELECT 'I', 74.0 FROM dual
UNION ALL SELECT 'J', 75.5 FROM dual
)
, calc AS
(
SELECT 1 id, 'A+B+((C/D) * E)' x FROM dual
UNION ALL SELECT 2, '(A+B+C+D+E+F+G+H+I+J)/10' FROM dual
)
, tmp AS
(
SELECT a.id
, a.x
, b.cd
, b.v
, ROW_NUMBER() OVER(PARTITION BY a.id ORDER BY b.cd) rn
, COUNT(*) OVER(PARTITION BY a.id) cnt
FROM calc a
, code b
WHERE INSTR(a.x, b.cd) > 0
)
, rec(id, x, cnt, rn, y) AS
(
SELECT id, x, cnt
, rn
, REPLACE(x, cd, v) y
FROM tmp
WHERE rn = 1
UNION ALL
SELECT a.id, a.x, a.cnt
, b.rn
, REPLACE(a.y, b.cd, b.v) y
FROM rec a
, tmp b
WHERE b.id = a.id
AND b.rn = a.rn + 1
)
SELECT id
, x
, y
, TO_NUMBER(
dbms_xmlgen.getxmltype('SELECT ' || y || ' FROM dual').Extract('//text()')
) z
FROM rec
WHERE cnt = rn
;
와... 이게 가능하군요.
1. 각각의 수식에 변수의 갯수를 파악해서 수식에 적용된 변수 갯수만큼 row 수를 만들어주고
2. 수식마다 만들어진 row 수 만큼 재귀함수를 돌려서 변수에 실제 데이터 값을 입력하고
3. row 수의 마지막 값만 추출 후에 계산식이 들어있는 문자열을 실제 데이터 값으로 처리하는 과정으로 이해 했습니다.
질문을 보고 고민 없이 "이거 안되는거 같은데..." 하고 넘어간 제가 부끄럽네요.
이게 되는군요,, 감사합니다 더 공부하겠습니다!