connect by를 사용했을 때 누적 합계 구하기 0 1 2,746

by 지호준 [2007.09.13 10:06:44]


table은 다음과 같습니다. 현재 행은 자신의 고유코드와 자신의 속해 있는 상위코드를 가집니다. value는 트리 구조에서 가장 하단에 위치할 경우만 값을 가집니다.

create table test(name varchar(20),

                  code number,                    -- 고유코드번호

                  asc_code number,             -- 상위코드번호

                  value number)

 

입력된 데이터는 다음과 같습니다.

      CODE SUBSTR(NAM   ASC_CODE      VALUE
---------- ----------         ---------- ----------
      1110 코카스       1100          2
      1120 치오와       1100          4
      1100 개과         1000
      1210 페르시아     1200          1
      1200 고양이과     1000
      1311 이구아나     1310          5
      1310 육상         1300
      1300 파충류과     1000
      1321 거북이       1320          6
      1320 해양         1300
      1000 애완동물
      1312 도마뱀       1310          9


위의 데이터를 가지고 connect by를 사용하여 계층적인 구조로 표현했습니다.

select level,
       substr(lpad(' ', 2*(level-1))||code, 1, 20),
       substr(name, 1, 10),
       substr(value, 1, 2)
  from test_ji
 start with name = '애완동물'
connect by prior code = asc_code

-----------------결과물----------------------

     LEVEL CODE              NAME     VALUE
---------- -------------------- ---------- --
         1     1000                 애완동물
         2       1100               개과
         3         1110             코카스       2
         3         1120             치오와       4
         2       1200               고양이과
         3         1210             페르시아     1
         2       1300               파충류과
         3         1310             육상
         4           1311           이구아나     5
         4           1312           도마뱀       9
         3         1320             해양
         4           1321           거북이       6

[문제]

현재 value 값은 최단의 말단 값들만 실제로 가지게 됩니다. 이것을 단 하나의 SQL문을 사용하여 하위 계정은 자신이 속한 상위계정에 합계값을 반영하게 하는 방법은 없을까요? 예를 들자면 '개과'에는 '코카스'와 '치와와'라는 하위 계정이 두 개가 있으므로 이들의 value인 2와 4를 더하여 6을 가지고 가장 상위 계정인 '애완동물'은 자신의 하위계정인 level=2의 value값을 가지게 말이지요.

분석함수를 좀 써서 하려고 해도 도무지 잘 되지가 않네요.;;

by 지호준 [2007.09.13 00:00:00]
(엔코어 사이트의 고수분의 도움을 받아 해결했습니다.)
select lev,
lev1,
substr(name, 1, 20),
decode(value, null, (select sum(value)
from test_ji b
start with code = a.code1
connect by prior b.code = b.asc_code), value)
from (select level lev,
substr(lpad(' ', 2*(level-1))||code, 1, 20) lev1,
substr(name, 1, 10) name,
substr(value, 1, 2) value,
code code1
from test_ji
start with asc_code is null
connect by prior code = asc_code) a
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입