두테이블을 이용한 수식 계산 0 2 790

by 산달 [SQL Query] [2017.07.25 16:42:13]


오라클 : 11g

A_TABLE 에는 

연번    구분    수식
1        1    (
2        2    변수1
3        2    변수2
4        2    변수3
5        1    +
6        2    변수4
7        2    변수5
8        1    )
9        1    /
10      1    (
11      2    변수6
12      2    변수7
13      1    )

* 상단 구분컬럼은 1:수식, 2:변수

B_TABLE 에는

연번    변수    값
1    변수1    10
1    변수1    5
2    변수2    10
3    변수2    5
4    변수2    20
5    변수3    10
6    변수4    5
7    변수4    10
8    변수5    10
9    변수6    20
10   변수7    15

결과 : (10+5+10+5+20+10 + 5+10+10) / (20+15) = 2.42

위 두테이블을 이용하여 A_TABLE의 수식을 완성하고 값을 구하고자 합니다.

변수와 변수 사이는 + 로 연결됩니다.

행을 열로 바꾸면서 두테이블을 조인하여 해보았지만 생각처럼 되지 않아 이렇게 문의 드립니다.

고수님들의 많은 조언 부탁드립니다.

감사합니다.

by 우리집아찌 [2017.07.25 17:04:42]

http://www.gurubee.net/article/59323


by 마농 [2017.07.25 17:35:04]
WITH a_table AS
(
SELECT 1 seq, 1 gb, '(' x FROM dual
UNION ALL SELECT  2, 2, '변수1' FROM dual
UNION ALL SELECT  3, 2, '변수2' FROM dual
UNION ALL SELECT  4, 2, '변수3' FROM dual
UNION ALL SELECT  5, 1, '+'     FROM dual
UNION ALL SELECT  6, 2, '변수4' FROM dual
UNION ALL SELECT  7, 2, '변수5' FROM dual
UNION ALL SELECT  8, 1, ')'     FROM dual
UNION ALL SELECT  9, 1, '/'     FROM dual
UNION ALL SELECT 10, 1, '('     FROM dual
UNION ALL SELECT 11, 2, '변수6' FROM dual
UNION ALL SELECT 12, 2, '변수7' FROM dual
UNION ALL SELECT 13, 1, ')'     FROM dual
)
, b_table AS
(
SELECT 1 seq, '변수1' x, 10 v FROM dual
UNION ALL SELECT  2, '변수1',  5 FROM dual
UNION ALL SELECT  3, '변수2', 10 FROM dual
UNION ALL SELECT  4, '변수2',  5 FROM dual
UNION ALL SELECT  5, '변수2', 20 FROM dual
UNION ALL SELECT  6, '변수3', 10 FROM dual
UNION ALL SELECT  7, '변수4',  5 FROM dual
UNION ALL SELECT  8, '변수4', 10 FROM dual
UNION ALL SELECT  9, '변수5', 10 FROM dual
UNION ALL SELECT 10, '변수6', 20 FROM dual
UNION ALL SELECT 11, '변수7', 15 FROM dual
)
SELECT TO_NUMBER(dbms_xmlgen.getxmltype('SELECT ' ||
       LISTAGG(DECODE(a.gb, 1, a.x, a.s || b.v)) WITHIN GROUP(ORDER BY a.seq)
       || ' FROM dual').Extract('//text()')) x
  FROM (SELECT seq, gb, x
             , CASE WHEN gb = 2 AND LAG(gb) OVER(ORDER BY seq) = 2 THEN '+' END s
          FROM a_table
        ) a
  LEFT OUTER JOIN
       (SELECT x
             , SUM(v) v
          FROM b_table
         GROUP BY x
        ) b
    ON a.gb = 2
   AND a.x = b.x
;

 

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