산식 변환 질문 0 3 5,970

by 쏭지 oracle [2024.06.03 17:41:12]


항목2.png (3,620Bytes)
산식.png (1,820Bytes)
산식결과.png (2,633Bytes)

이런식으로 항목구분에 따른 항목값이 있는 테이블이 있고 산식이 있는 테이블이 있습니다.

맨밑에 결과 산식변환처럼 결과값이 나와야 합니다ㅠㅠ

산식이 해당 이미지처럼 고정은 아니고 A+B+((C/D) * E) 이런식으로 다양하게 있고 항목구분의 값들과 매칭이 되어야 합니다 

정적쿼리로 될까요?

by 마농 [2024.06.04 10:34:23]
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
;

 


by 우주민 [2024.06.04 13:18:34]

와... 이게 가능하군요.

 

1. 각각의 수식에 변수의 갯수를 파악해서 수식에 적용된 변수 갯수만큼 row 수를 만들어주고 

2. 수식마다 만들어진 row 수 만큼 재귀함수를 돌려서 변수에 실제 데이터 값을 입력하고

3. row 수의 마지막 값만 추출 후에 계산식이 들어있는 문자열을 실제 데이터 값으로 처리하는 과정으로 이해 했습니다.

 

질문을 보고 고민 없이 "이거 안되는거 같은데..." 하고 넘어간 제가 부끄럽네요.


by 쏭지 [2024.06.07 08:44:58]

이게 되는군요,, 감사합니다 더 공부하겠습니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입