메뉴 건너뛰기

tnt_db

http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1010&seq=58&page=2&position=2글쓴이 : 김홍선


예제 1)

다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법(1) 에서,
만약 행들이 그룹번호에 따라 그룹으로 나뉘어져 있고,
각 그룹별로 하나의 행으로 컴마로 분리해 출력하려고 하면 어떻게 해야 할 것인가?

이름    그룹
==========
홍길동  1
김길동  1  
이길동  1
홍순신  2
김순신  2
이순신  2
==========

-->

그룹 이름
======================
1   홍길동,김길동,이길동
2   홍순신,김순신,이순신
======================


emp.ename 컬럼, 그리고 그룹번호로 emp.deptno 컬럼을 예로 들어 쿼리를 구성해 보자.

emp 테이블의 deptno, ename 컬럼은 아래와 같다.

10    CLARK
10    KING
10    MILLER
20    ADAMS
20    FORD
20    JONES
20    SCOTT
20    SMITH
30    ALLEN
30    BLAKE
30    JAMES
30    MARTIN
30    TURNER
30    WARD


쿼리와 쿼리 결과는 아래와 같다.
쿼리에서 정확히 어떤 컬럼들이 어떤 역할을 하는지 이번에도 숙지하도록 하자.


SELECT     deptno, SUBSTR (MAX (SYS_CONNECT_BY_PATH (ename, ',')), 2) path#
      FROM (SELECT ename, deptno,
                   ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY ename) rnum
              FROM emp)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR deptno = deptno
  GROUP BY deptno


10    CLARK,KING,MILLER
20    ADAMS,FORD,JONES,SCOTT,SMITH
30    ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD



예제 2)


이번에는 deptno 와 같이 그룹으로 나뉘는 컬럼이 2개(deptno,job) 일 때를 고려해 보자. (group by deptno, job)
3개 이상도 비슷한 방법으로 해결한다.
즉 아래의 테이블을,


10        CLERK      MILLER
10        MANAGER    CLARK
10        PRESIDENT  KING
---------------------------
20        ANALYST    FORD
20        ANALYST    SCOTT
20        CLERK      ADAMS
20        CLERK      SMITH
20        MANAGER    JONES
---------------------------
30        CLERK      JAMES
30        MANAGER    BLAKE
30        SALESMAN   ALLEN
30        SALESMAN   MARTIN
30        SALESMAN   TURNER
30        SALESMAN   WARD


아래와 같이 출력이 되도록 쿼리를 만들어 보자.


10    CLERK      MILLER
10    MANAGER    CLARK
10    PRESIDENT  KING
20    CLERK      ADAMS,SMITH
20    ANALYST    FORD,SCOTT
20    MANAGER    JONES
30    CLERK      JAMES
30    MANAGER    BLAKE
30    SALESMAN   ALLEN,MARTIN,TURNER,WARD


쿼리는 아래와 같다.
1번 예제의 쿼리에서 추가된 부분을 눈여겨 보자.
주의 : SYS_CONNECT_BY_PATH는 9i이상에서 가능함


SELECT     deptno, job,
           SUBSTR (MAX (SYS_CONNECT_BY_PATH (ename, ',')), 2) path#
      FROM (SELECT deptno, job, ename,
                   ROW_NUMBER () OVER (PARTITION BY deptno, job ORDER BY ename) rnum
              FROM emp)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR deptno = deptno AND PRIOR job = job
  GROUP BY deptno, job


번호 제목 글쓴이 날짜 조회 수
106 최단거리찾기 혹은 멀리 떨어진 두지점간의 거리의 합구하기 박상현 2006.11.07 3690
105 PL/SQL에서 쿼리시 Array Processing 처리방법 박상현 2006.10.27 3622
104 시간선분(선분이력)의 합집합 구하기 박상현 2006.06.13 5159
103 최대공약수, 최소공배수 구하기 박상현 2006.06.13 3839
102 문자열에서 특정 단어 갯수 구하기 박상현 2006.06.13 3573
101 소수(prime number) 구하기 박상현 2006.06.13 3425
100 달력 생성 쿼리 박상현 2006.06.13 3345
» 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (2) 박상현 2006.06.13 3968
98 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (1) 박상현 2006.06.13 3697
97 문자열 행으로 분리하기 박상현 2006.06.13 3827
96 TABLE,COLUMN,PROCEDURE 이름을 확인할때... 원우석 2006.03.10 3114
95 NESTED TABLE과 VARRAY사용법과 다른점 박상현 2005.11.03 8834
94 데이타 모델링(이화식 강의) 부분 목차정리. 박상현 2004.06.22 3361
93 oracle 8i제공 explan table 생성 script 박상현 2004.05.08 2662
92 toad에서 사용가능한 explan_table생성 script 박상현 2004.05.08 6683
91 ORACLE -> MSSQL 시 LPAD 처리 운영자 2003.10.08 4268
90 plan table(sql실행계획) 보는 select문 운영자 2003.01.28 3988
89 java에서 array처리 방법 운영자 2003.01.27 6189
88 효율적인 25가지 SQL작성법 운영자 2003.01.04 2948
87 중복 data는 처음에만 display 하게 하는 방법 운영자 2002.11.23 2965
위로