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 37873 게시물 읽기
No. 37873
유동적인 조직도를 구현하려면 어떻게 해야하나요 ?
작성자
simon
작성일
2010-08-19 13:58
조회수
3,198

with tr1 as (
select 1000 chl_id, 0 par_id, '한국' nm from dual union all
select 1100, 1000, '서울' from dual union all
select 1110, 1100, '강남구' from dual union all
select 1111, 1110, '도곡동' from dual union all
select 1112, 1110, '대치동' from dual union all
select 1120, 1100, '서초구' from dual union all
select 1121, 1110, '양재동' from dual union all
select 1122, 1110, '서초동' from dual union all
select 1200, 1000, '경기' from dual union all
select 1210, 1200, '수원팔달구' from dual union all
select 1211, 1210, '장안동' from dual union all
select 1212, 1210, '수인동' from dual union all
select 1220, 1200, '수원영통구' from dual union all
select 1221, 1220, '영통동' from dual union all
select 1222, 1220, '영도동' from dual union all
select 1230, 1200, '안양만안구' from dual union all
select 1231, 1230, '안양동' from dual union all
select 1232, 1230, '석수동' from dual union all
select 1240, 1200, '안양동안구' from dual union all
select 1241, 1240, '비산동' from dual union all
select 1242, 1240, '관양동' from dual union all
select 2000, 0, '미국' from dual union all
select 2100, 2000, '워싱턴' from dual union all
select 2110, 2100, 'A Street' from dual union all
select 2120, 2100, 'B Street' from dual
),
tr as (
select 1111 as cd, '20100101' as dt, 1000 qty from dual union all
select 1111, '20100102', 1000 from dual union all
select 1112, '20100101', 1001 from dual union all
select 1112, '20100102', 1001 from dual union all
select 1121, '20100101', 1002 from dual union all
select 1121, '20100102', 1002 from dual union all
select 1122, '20100101', 1003 from dual union all
select 1122, '20100102', 1003 from dual union all
select 1211, '20100101', 2000 from dual union all
select 1211, '20100102', 2000 from dual union all
select 1212, '20100101', 2001 from dual union all
select 1212, '20100102', 2001 from dual union all
select 1221, '20100101', 2002 from dual union all
select 1221, '20100102', 2002 from dual
)
select a.chl_id, a.nm, b.dt, b.qty
  from tr1 a,
       tr b
 where a.chl_id = b.cd(+)
 connect by prior a.chl_id = a.par_id
 
결과는 다음과 같이 됩니다.

CHL_ID NM DT QTY
1000 한국    
1200 경기    
1230 안양만안구    
1232 석수동    
1231 안양동    
1210 수원팔달구    
1211 장안동 20100101 2000
1211 장안동 20100102 2000
1212 수인동 20100101 2001
1212 수인동 20100102 2001
1220 수원영통구    
1221 영통동 20100101 2002
1221 영통동 20100102 2002
1222 영도동    
1240 안양동안구    
1242 관양동    
1241 비산동    
1100 서울    
1120 서초구    
1110 강남구    
1111 도곡동 20100101 1000
1111 도곡동 20100102 1000
1112 대치동 20100101 1001
1112 대치동 20100102 1001
1121 양재동 20100101 1002
1121 양재동 20100102 1002
1122 서초동 20100101 1003
1122 서초동 20100102 1003
2000 미국    
2100 워싱턴    
2120 B Street    
2110 A Street    
1200 경기    
1230 안양만안구    
1232 석수동    
1231 안양동    
1210 수원팔달구    
1211 장안동 20100101 2000
1211 장안동 20100102 2000
1212 수인동 20100101 2001
1212 수인동 20100102 2001
1220 수원영통구    
1221 영통동 20100101 2002
1221 영통동 20100102 2002
1222 영도동    
1240 안양동안구    
1242 관양동    
1241 비산동    
1100 서울    
1120 서초구    
1110 강남구    
1111 도곡동 20100101 1000
1111 도곡동 20100102 1000
1112 대치동 20100101 1001
1112 대치동 20100102 1001
1121 양재동 20100101 1002
1121 양재동 20100102 1002
1122 서초동 20100101 1003
1122 서초동 20100102 1003
1120 서초구    
1110 강남구    
1111 도곡동 20100101 1000
1111 도곡동 20100102 1000
1112 대치동 20100101 1001
1112 대치동 20100102 1001
1121 양재동 20100101 1002
1121 양재동 20100102 1002
1122 서초동 20100101 1003
1122 서초동 20100102 1003
1111 도곡동 20100101 1000
1111 도곡동 20100102 1000
1112 대치동 20100101 1001
1112 대치동 20100102 1001
1121 양재동 20100101 1002
1121 양재동 20100102 1002
1122 서초동 20100101 1003
1122 서초동 20100102 1003
1230 안양만안구    
1232 석수동    
1231 안양동    
1210 수원팔달구    
1211 장안동 20100101 2000
1211 장안동 20100102 2000
1212 수인동 20100101 2001
1212 수인동 20100102 2001
1220 수원영통구    
1221 영통동 20100101 2002
1221 영통동 20100102 2002
1222 영도동    
1240 안양동안구    
1242 관양동    
1241 비산동    
1211 장안동 20100101 2000
1211 장안동 20100102 2000
1212 수인동 20100101 2001
1212 수인동 20100102 2001
1221 영통동 20100101 2002
1221 영통동 20100102 2002
1222 영도동    
1232 석수동    
1231 안양동    
1242 관양동    
1241 비산동    
2100 워싱턴    
2120 B Street    
2110 A Street    
2120 B Street    
2110 A Street    

이것은 조직도를 유동적으로 4Level 5 Level (NM1 ~ NM8)등 다양하게 유동적입니다. 하기와 같은 결과를 받고 싶은데... 방법이...

NM1 NM2 NM3 NM4 DT QTY
한국 경기 안양만안구 석수동    
한국 경기 안양만안구 안양동    
한국 경기 수원팔달구 장안동 20100101 2000
한국 경기 수원팔달구 장안동 20100102 2000
한국 경기 수원팔달구 수인동 20100101 2001
한국 경기 수원팔달구 수인동 20100102 2001
.. .. ..

어떻게 하면될지 아이디어가 영...

사용환경은 Oracle 8.X 대입니다.

 

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

Oracle 8.X 에서 지원하는 지는 모르겠는데요...

SELECT  REGEXP_SUBSTR(NM_PATH,'[^>]+')     AS NM1
       ,REGEXP_SUBSTR(NM_PATH,'[^>]+',1,2) AS NM2
       ,REGEXP_SUBSTR(NM_PATH,'[^>]+',1,3) AS NM3
       ,REGEXP_SUBSTR(NM_PATH,'[^>]+',1,4) AS NM4
       ,B.DT
       ,B.QTY
  FROM (
            SELECT  SYS_CONNECT_BY_PATH(A.NM,'>') AS NM_PATH
                   ,A.CHL_ID
              FROM  TR1 A
        START WITH PAR_ID = 0 
        CONNECT BY PRIOR A.CHL_ID = A.PAR_ID
       )    A
        ,TR B
 WHERE  A.CHL_ID = B.CD (+)
 ;

깨비(ggaevi)님이 2010-08-19 15:07에 작성한 댓글입니다.
이 댓글은 2010-08-19 15:15에 마지막으로 수정되었습니다.

Sys_connect_by_path 는 9i부터 가능
RegExp 는 10g부터 가능
8i 에서 테스트 했습니다. 8.0 이라면 다른 방법으로...


SELECT SUBSTR(nms, INSTR('/'||nms,'/',1,1)
     , INSTR(nms||'/','/',1,1)-INSTR('/'||nms,'/',1,1)) nm1
     , SUBSTR(nms, INSTR('/'||nms,'/',1,2)
     , INSTR(nms||'/','/',1,2)-INSTR('/'||nms,'/',1,2)) nm2
     , SUBSTR(nms, INSTR('/'||nms,'/',1,3)
     , INSTR(nms||'/','/',1,3)-INSTR('/'||nms,'/',1,3)) nm3
     , SUBSTR(nms, INSTR('/'||nms,'/',1,4)
     , INSTR(nms||'/','/',1,4)-INSTR('/'||nms,'/',1,4)) nm4
     , SUBSTR(nms, INSTR('/'||nms,'/',1,5)
     , INSTR(nms||'/','/',1,5)-INSTR('/'||nms,'/',1,5)) nm5
     , SUBSTR(nms, INSTR('/'||nms,'/',1,6)
     , INSTR(nms||'/','/',1,6)-INSTR('/'||nms,'/',1,6)) nm6
     , SUBSTR(nms, INSTR('/'||nms,'/',1,7)
     , INSTR(nms||'/','/',1,7)-INSTR('/'||nms,'/',1,7)) nm7
     , SUBSTR(nms, INSTR('/'||nms,'/',1,8)
     , INSTR(nms||'/','/',1,8)-INSTR('/'||nms,'/',1,8)) nm8
     , dt, qty
  FROM (SELECT rn, lv
             , chl_id, par_id, nm
             , (SELECT MIN(DECODE(a.lv - LEVEL, 0, nm))
               ||'/'|| MIN(DECODE(a.lv - LEVEL, 1, nm))
               ||'/'|| MIN(DECODE(a.lv - LEVEL, 2, nm))
               ||'/'|| MIN(DECODE(a.lv - LEVEL, 3, nm))
               ||'/'|| MIN(DECODE(a.lv - LEVEL, 4, nm))
               ||'/'|| MIN(DECODE(a.lv - LEVEL, 5, nm))
               ||'/'|| MIN(DECODE(a.lv - LEVEL, 6, nm))
               ||'/'|| MIN(DECODE(a.lv - LEVEL, 7, nm)) nm
                  FROM tr1 b
                 START WITH chl_id = a.chl_id
                 CONNECT BY chl_id = PRIOR par_id
                ) nms
             , DECODE(chl_id
               , LEAD(par_id) OVER(ORDER BY rn), 0, 1) is_leaf
          FROM (SELECT ROWNUM rn
                     , LEVEL lv
                     , chl_id, par_id, nm
                  FROM tr1
                 START WITH par_id = 0
                 CONNECT BY PRIOR chl_id = par_id
                ) a
        ) a
     , tr b
 WHERE a.is_leaf = 1
   AND a.chl_id = b.cd(+)
 ORDER BY rn, dt
;

마농(manon94)님이 2010-08-19 16:40에 작성한 댓글입니다.

두분 모두 감사합니다. 마농님 덕분에 해결했습니다.

simon님이 2010-08-20 13:53에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
37876case when 오동작?? [10]
이용찬
2010-08-20
3572
37875export->imp 한글 깨짐.
이슬이
2010-08-19
3815
37874기존데이터를 변동하지 않고 테이블에 새로운 컬럼추가하고자 합니다. [2]
신입
2010-08-19
3225
37873유동적인 조직도를 구현하려면 어떻게 해야하나요 ? [3]
simon
2010-08-19
3198
37872이 쿼리 해석좀^^;; [1]
조용두
2010-08-18
2735
37871숫자를 한글로.. [1]
아폴론
2010-08-18
3135
37870해석좀 부탁드려요.... [4]
이상영
2010-08-18
2901
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다