by 마농 sys_conect_by_path [2010.01.13 14:38:48]
[퀴즈] 계층구조쿼리의 응용 - 부호를 적용하여 하위계층 누적합계 구하기
코드(cd)와 부모코드(pcd)를 가진 테이블 test 가 있습니다.
이 테이블을 이용하여 계층구조의 쿼리를 작성하세요.
이때, 자기 자신을 포함한 하위 노드들의 누적합을 구해야 합니다.
누적합을 구할때는 최하위 노드로부터 주어진 부호를 적용시켜서 합산하고,
합산된 결과는 상위노드의 결과에 합산하면서 상위노드의 부호를 다시 적용시켜야 합니다.
계산방식은 아래 결과표를 참조하세요.
WITH test AS
(
SELECT 1000 cd, NULL pcd, 0 amt, '+' sign FROM dual
UNION ALL SELECT 1100, 1000, 100, '-' FROM dual
UNION ALL SELECT 1110, 1100, 200, '+' FROM dual
UNION ALL SELECT 1111, 1110, 50, '-' FROM dual
UNION ALL SELECT 1120, 1100, 100, '+' FROM dual
UNION ALL SELECT 1200, 1000, 150, '-' FROM dual
UNION ALL SELECT 1210, 1200, 300, '+' FROM dual
)
SELECT * FROM test;
CD PCD AMT SIGN CD LV AMT SIGN SUM_AMT + 1 + - 2 - + 3 + - 4 - + 3 + - 2 - + 3 +
[원본]
[결과]
계산방법 참조
1000
0
1000
0
-800
+(0 - 350 - 450) = -800
1100
1000
100
--1100
100
-350
-(100 + 150 + 100) = -350
1110
1100
200
----1110
200
150
+(200 - 50) = 150
1111
1110
50
------1111
50
-50
-(50) = -50
1120
1100
100
----1120
100
100
+(100) = 100
1200
1000
150
--1200
150
-450
-(150 + 300) = -450
1210
1200
300
----1210
300
300
+(300) = 300
정답은 몇일 뒤에 올리도록 하겠습니다.
[정답보기] <=== 트리플클릭
SELECT LPAD(cd,2+LEVEL*2,'-') cd
, LEVEL lv
, amt
, sign
, (SELECT SUM(DECODE(
MOD(LENGTH(REPLACE(SYS_CONNECT_BY_PATH(sign,','),'-')),2)
,0,1,-1) * amt)
FROM test
START WITH cd = main.cd
CONNECT BY PRIOR cd = pcd
) sum_amt
FROM test main
START WITH pcd IS NULL
CONNECT BY PRIOR cd = pcd
;