계층 구조 쿼리에서 하위 레벨의 로우 수를 구할 수 있을까요? 0 9 1,768

by yozm0213 [SQL Query] [2014.12.12 09:32:41]


오라클.JPG (32,653Bytes)

예를 들면 아래 처럼 데이터가 들어 있다면 각 레벨 1에 하위에 있는 2,3레벨의 로우수를 카운트하여

구할 수 있는지 궁금합니다. 아니면 이걸 그냥 자바에서 처리해야 하는건지..

원하는 출력 값은

SELECT

KEY, UPPER_KEY, TEXT, 하위레벨의 로우수

FROM

CONNECT BY PRIOR CLASS_CODE = UPPER_CLASS_CODE                                                                          

START WITH CLASS_CODE = 'ROOT'

 

 

LEVEL 1      KEY 1000001    UPPER_KEY     ROOT         TEXT      1

           2               2000001                           1000001                    1

           3              3000001                             2000001                   1

           1              1000002                             ROOT                      1

           2              2000002                             1000002                   1

           3              3000002                             2000001                   1

by 비주류 [2014.12.12 09:51:44]

COUNT(*) OVER (PARTITION BY CONNECT_BY_ROOT upper_class_code) - 1


by yozm0213 [2014.12.12 10:05:49]

이 구문을 쓰면 내부오류 코드가 발생하네요...ora-00600


by 마농 [2014.12.12 10:14:33]

원하시는 결과표를 보여 주세요.


by yozm0213 [2014.12.12 10:25:04]

결과표 첨부하였습니다. ROW_COUNT라는 임의의 컬럼을 생성하였고 저런식으로 각가 하위에 포함된 로우 갯수를 구할 수 있는지 문의드린겁니다. 예를 들면 1레벨은 하위레벨 2와3의 로우 갯수를 구하고 2레벨은 그 하위 로우의 갯수를 구하는 방식으로요..일단 저런 방법으로 로우 갯수를 구할 수 있는지 궁금하네요.


by 마농 [2014.12.12 10:26:38]

왜 다 2 죠?


by yozm0213 [2014.12.12 10:33:10]

제가 임의로 '2'로 넣어서 그렇습니다. 구하고 싶은 부분이 저 부분이입니다.

원래대로라면 2, 1, 0, 1, 0, 1, 0이 나와야 원하는 결과값이 나오는거겠죠..


by 아발란체 [2014.12.12 11:18:49]

음.... 어렵다... ㅎㅎ


by 마농 [2014.12.12 11:38:04]
WITH t AS
(
SELECT '1000004' key_code, '1000004' class_code, 'ROOT' upper_class_code FROM dual
UNION ALL SELECT '1000004', '2000005', '1000004' FROM dual
UNION ALL SELECT '1000004', '3000015', '2000005' FROM dual
UNION ALL SELECT '1000005', '1000005', 'ROOT'    FROM dual
UNION ALL SELECT '1000005', '2000006', '1000005' FROM dual
UNION ALL SELECT '1000006', '1000006', 'ROOT'    FROM dual
UNION ALL SELECT '1000006', '2000007', '1000006' FROM dual
)
SELECT a.lv
     , a.key_code
     , a.class_code
     , a.upper_class_code
     , b.cnt
  FROM (SELECT LEVEL lv
             , key_code
             , class_code
             , upper_class_code
             , ROWNUM rn
          FROM t
         START WITH upper_class_code = 'ROOT'
         CONNECT BY PRIOR key_code   = key_code
                AND PRIOR class_code = upper_class_code
        ) a
     , (SELECT key_code, class_code
             , COUNT(*) - 1 cnt
          FROM (SELECT CONNECT_BY_ROOT key_code   key_code
                     , CONNECT_BY_ROOT class_code class_code
                  FROM t
                 CONNECT BY PRIOR key_code   = key_code
                        AND PRIOR class_code = upper_class_code
                )
         GROUP BY key_code, class_code
        ) b
 WHERE a.key_code   = b.key_code
   AND a.class_code = b.class_code
 ORDER BY rn
;

 


by yozm0213 [2014.12.12 14:49:43]

감사합니다. 제 쿼리에 맞게 잘 바꿔서 만들었습니다. 역시나 쉽지많은 않네요..^^

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