database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40750 게시물 읽기
No. 40750
계층형구조에서 하위 데이터 카운트
작성자
이혜미(hmleena)
작성일
2015-03-20 10:17
조회수
10,154

 

 ID DEPTH PRN_ID
A 1  
B 1  
C 2 A
D 2 A
E 3 C
F 2 B
G 2 B
H 3 E
I 3 E

 계층형구조로 위와같은 데이터가 있을 경우

 

아래와 같이 하위 데이터 row 수를 구하고 싶습니다.( 하위의 하위 데이터 갯수 까지 포함)

 ID 하위데이터 row 수
A 3
B 2
C 3
D 0
E 2
F 0
G 0
H 0
I 0

 

참고로 dept는 4단계까지 있을 수도 있는데 한번의 쿼리로 가능할까요?

이 글에 대한 댓글이 총 1건 있습니다.

 예제에 보면 C의 하위가 3인 것으로 되어 있는데요...

중간 노드까지 합해야 3인 거 아닌가요?

반면 A는 최하위만 합치면 3이고 중간 노드까지 합치면 5 인듯...

 

그래서

중간노드까지 합치는 겨우

with base_table as
(
select 'A' id , null prn_id from dual 
union all select 'B' id , null prn_id from dual 
union all select 'C' id , 'A' prn_id from dual
union all select 'D' id , 'A' prn_id from dual
union all select 'E' id , 'C' prn_id from dual
union all select 'F' id , 'B' prn_id from dual
union all select 'G' id , 'B' prn_id from dual
union all select 'H' id , 'E' prn_id from dual
union all select 'I' id , 'E' prn_id from dual
)
, tree_data as
(
    select
        a.id
        , a.prn_id
        , connect_by_root(a.id) root_id
        , connect_by_isleaf is_leaf
    from     base_table a
    connect by
        prior   a.id = a.prn_id
    order siblings by
        a.id
)
select
    a.root_id
    ,count(case when a.id = a.root_id then null else 1 end) cnt
from    tree_data a
where   1 = 1
--and     a.is_leaf = 1
group by
    a.root_id
order by
    a.root_id
 
 
최하위만
with base_table as
(
select 'A' id , null prn_id from dual 
union all select 'B' id , null prn_id from dual 
union all select 'C' id , 'A' prn_id from dual
union all select 'D' id , 'A' prn_id from dual
union all select 'E' id , 'C' prn_id from dual
union all select 'F' id , 'B' prn_id from dual
union all select 'G' id , 'B' prn_id from dual
union all select 'H' id , 'E' prn_id from dual
union all select 'I' id , 'E' prn_id from dual
)
, tree_data as
(
    select
        a.id
        , a.prn_id
        , connect_by_root(a.id) root_id
        , connect_by_isleaf is_leaf
    from     base_table a
    connect by
        prior   a.id = a.prn_id
    order siblings by
        a.id
)
select
    a.root_id
    ,count(case when a.id = a.root_id then null else 1 end) cnt
from    tree_data a
where   1 = 1
and     a.is_leaf = 1
group by
    a.root_id
order by
    a.root_id
 
김흥수(protokhs)님이 2015-03-20 11:46에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40754초보자 쿼리 짜는것좀 도와주세요 ㅠㅠ [2]
첼시리우
2015-03-26
6417
40753TYPE object 를 만들고 다른 디비에서 디비 링크로 사용 할 수 없나요? [2]
안녕하세요
2015-03-26
6423
40752원화환산 평잔 퀴즈입니다. [9]
김흥수
2015-03-24
8490
40750계층형구조에서 하위 데이터 카운트 [1]
이혜미
2015-03-20
10154
40749OCP 자격 취득
정용석
2015-03-19
6347
40748오라클 tree 구조 질문좀 드립니다. [6]
ka
2015-03-19
7910
40747체적쿼리 질문입니다. [11]
초보자
2015-03-18
9546
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다