오라클 계층형 쿼리 작성 방법 0 6 3,045

by db초보에요 [SQL Query] ORACLE SQL [2019.01.10 13:06:42]


일단 테이블 데이터 예시를 들면 아래와 같은 형식으로 저장 되어있습니다.

 

 

 대 소  수량 
 컴퓨터 pc  cpu  1
 컴퓨터 pc ram 2
 컴퓨터 모니터 hdmi  1
 자동차 엔진  휘발유 
 자동차 엔진 디젤 1

 

위와 같이 대,중,소 항목으로 되어 있는 데이터를 계층형 쿼리로 짜서 아래 같이 표현을 하려고 합니다.

 

결과형식))

 

 

 구분 수량 
 컴퓨터  

      pc

 

          cpu

          ram

     모니터 

 

          hdmi

자동차  

     엔진

 

        휘발유

 

결과적으로 이런식으로 나오게 쿼리를 짜려고 하는데

고수님들 도움좀 주십시오.

by 우리집아찌 [2019.01.10 13:34:51]
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   

 


by db초보에요 [2019.01.11 10:09:37]

답변 감사합니다.

한가지 더 문의드릴게 있는데 이 쿼리에서 아래 마농님이 답변해주신 쿼리 결과처럼

레벨별로도 sum을 할 수 있는 방법이 있을까요?


by 우리집아찌 [2019.01.11 10:48:07]

ROLL 하시려면 다시 원본 데이터처럼 가공을 해야하는데

그럴거면 차라리 마농님 SQL 쓰시는게 나을것 같은데요.

SQL에 불필요한 작업이 추가될듯합니다.

 


by 마농 [2019.01.11 10:52:02]

1. 원본으로 부터 합계 가져오는 방법
  - 변경전 : NULL cnt
  - 변경후 : SUM(cnt) cnt
2. 계층 쿼리를 이용한 하위 합계 구하는 방법
  - http://gurubee.net/lecture/2250
  - 굳이 이렇게까지 어렵게 작성할 필요가 있는지 의문이네요.


by 마농 [2019.01.10 13:42:35]
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
;

 


by db초보에요 [2019.01.11 10:09:54]

답변 감사합니다.

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