메뉴 건너뛰기

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


번호 제목 글쓴이 날짜 조회 수
86 LENGTH/LENGTHB,SUBSTR/SUBSTRB,INSTR/INSTRB 운영자 2002.09.18 4050
85 PARAMETER값 변경에따른 유연한 GROUP BY 운영자 2002.09.18 4040
84 최대값과 최소값을 뺀 평균 운영자 2002.09.18 3941
83 한번 읽은 테이블로 백분율 구하기 운영자 2002.09.18 3834
82 plan table(sql실행계획) 보는 select문 운영자 2003.01.28 3831
» 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (2) 박상현 2006.06.13 3816
80 sybase DB에서 파일로 백업을 받구 그파일을 다시 DB2로 임포트하는방법 원우석 2004.07.31 3748
79 특정문자까지의 왼쪽 문자열 반환 function 운영자 2002.10.18 3743
78 row데이터 연결하여 조회 구퍼 2009.03.31 3663
77 년중 몇번째 주간인지 알아내기(FUNCTION) - ORACLE이 제공하는 것과 다름 운영자 2002.09.17 3630
76 최단거리찾기 혹은 멀리 떨어진 두지점간의 거리의 합구하기 박상현 2006.11.07 3608
75 다수 NULL 허용 COLUMN의 명칭을 가져올때 운영자 2002.09.18 3572
74 문자열 행으로 분리하기 박상현 2006.06.13 3552
73 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (1) 박상현 2006.06.13 3537
72 복제를이용한 합계계에서 비율계산 운영자 2002.09.18 3534
71 RECORD단위 DATA를 COLUMN단위로 운영자 2002.09.18 3507
70 sql 문 실행명령 원우석 2004.07.31 3500
69 최대공약수, 최소공배수 구하기 박상현 2006.06.13 3479
68 PL/SQL에서 쿼리시 Array Processing 처리방법 박상현 2006.10.27 3469
67 반올림 DATA의 오차보정 운영자 2002.09.18 3463
위로