WITH T ( V1 , V2 , V3 , CNT ,RN ) AS ( SELECT '컴퓨터' , 'pc' , 'cpu' , 1 , 1 FROM DUAL UNION ALL SELECT '컴퓨터' , 'pc' , 'ram' , 2 , 2 FROM DUAL UNION ALL SELECT '컴퓨터' , '모니터' , 'hdmi' , 1 , 3 FROM DUAL UNION ALL SELECT '자동차' , '엔진' , '휘발유' , 1 , 4 FROM DUAL UNION ALL SELECT '자동차' , '엔진' , '디젤' , 1 , 5 FROM DUAL ) SELECT LPAD(CODE, LENGTH(CODE) + LEVEL*4-1 ,' ') "구분" , CNT "수량" FROM (SELECT V1 CODE , NULL UP_CODE , NULL CNT ,MIN(RN) RN FROM T GROUP BY V1 UNION ALL SELECT V2 , V1 , NULL , MIN(RN) FROM T GROUP BY V1 , V2 UNION ALL SELECT V3 , V2 , CNT , RN FROM T ) START WITH UP_CODE IS NULL CONNECT BY PRIOR CODE = UP_CODE ORDER SIBLINGS BY RN
1. 원본으로 부터 합계 가져오는 방법
- 변경전 : NULL cnt
- 변경후 : SUM(cnt) cnt
2. 계층 쿼리를 이용한 하위 합계 구하는 방법
- http://gurubee.net/lecture/2250
- 굳이 이렇게까지 어렵게 작성할 필요가 있는지 의문이네요.
WITH t AS ( SELECT '컴퓨터' gb1, 'pc' gb2, 'cpu' gb3, 1 cnt FROM dual UNION ALL SELECT '컴퓨터', 'pc' , 'ram' , 2 FROM dual UNION ALL SELECT '컴퓨터', '모니터', 'hdmi' , 1 FROM dual UNION ALL SELECT '자동차', '엔진' , '휘발유', 1 FROM dual UNION ALL SELECT '자동차', '엔진' , '디젤' , 1 FROM dual ) SELECT DECODE('', gb2, gb1, gb3, ' '||gb2, ' '||gb3) gb , SUM(cnt) cnt FROM t GROUP BY gb1, ROLLUP(gb2, gb3) ORDER BY gb1, gb2 NULLS FIRST, gb3 NULLS FIRST ;