메뉴 건너뛰기

tnt_db

Oracle 테이블 열항목을 행항목으로 변경하는 팁

구퍼 2011.01.11 14:21 조회 수 : 8675

어떤 테이블에 여러개의 열항목(칼럼)을 행항목(로)으로 변경해야 하는 경우
한 레코드에 여러개의 항목이 있으므로 이를 여러줄의 한 항목으로 만들기 위해서
일단 레코드 뻥튀기(자기복제)를 해야 하고
그걸 위해 임시테이블을 하나 사용합니다.

여기서는 copy_t 라는 이름의 테이블을 사용해봅니다.
copy_t는 어떠한 형태든 상관 없지만 "원하는 갯수의 레코드"를 만들 수 있는 조건이 가능해야 합니다.
(여기서는 간단하게 1~n 까지의 숫자를 넣어서 만들었습니다.)
 
create table #t1
(
 a char(2),
 b char(2),
 c char(2),
 d char(2),
 e char(2),
 f char(2)
)
create unique index idx_t1_key on #t1(a, b)
 
insert into #t1 values ('a1', 'b1', 'c1', 'd1', 'e1', 'f1')
insert into #t1 values ('a2', 'b2', 'c2', 'd2', 'e2', 'f2')
insert into #t1 values ('a3', 'b3', 'c3', 'd3', 'e3', 'f3')


#t1 테이블에 6개의 칼럼이 있는 레코드가 있습니다.
 

 
create table #copy_t
(
 num int
)
create unique index idx_copy_t_key on #copy_t(num)
 
insert into #copy_t values (1)
insert into #copy_t values (2)
insert into #copy_t values (3)
insert into #copy_t values (4)
insert into #copy_t values (5)
insert into #copy_t values (6)
insert into #copy_t values (7)
 
#copy_t 테이블에는 1부터 7까지의 숫자 레코드가 있습니다.
 
 
#t1 테이블의 레코드 중 a,b 칼럼은 항상 추출하고 나머지 칼럼 4개는 행으로 만드는 쿼리입니다.
select a, b,
 case
   when num = 1 then c
   when num = 2 then d
   when num = 3 then e
   when num = 4 then f
end
from (
 select x.*, y.num
 from #t1 x, #copy_t y
 where y.num <= 4
) p
order by a, b
 
 
일단 레코드로 변경하고 싶은 컬럼의 갯수만큼 뻥튀기를 시키고
(인라인뷰의 copy_t 조인,  조인 조건이 없음에 주목하세요...)
뻥튀기 된 레코드 중에서 실제로 읽어야 할 컬럼만 읽도록 합니다.
(case when 부분)
번호 제목 글쓴이 날짜 조회 수
126 부등호 조인 운영자 2002.09.18 56559
125 REPORT 양식 맞추기 운영자 2002.09.18 31280
124 PARAMETER값에 따라 변경이 일어나는 문장 운영자 2002.09.17 15661
123 oracle proc 에서 stdarg.h파일사용하기위한 환경설정 원우석 2004.12.06 12508
» 테이블 열항목을 행항목으로 변경하는 팁 구퍼 2011.01.11 8675
121 NESTED TABLE과 VARRAY사용법과 다른점 박상현 2005.11.03 8642
120 바로이전 ROW의 값을 참조하고자 할때 운영자 2002.09.18 8493
119 oracle의 procedure에서의 여러 리턴값의 활용 예 운영자 2002.10.18 8151
118 오라클 DB 링크 만들기 구퍼 2011.01.06 6510
117 toad에서 사용가능한 explan_table생성 script 박상현 2004.05.08 6381
116 mssql update예제(select ~ update) 구퍼 2008.10.31 6115
115 java에서 array처리 방법 운영자 2003.01.27 6033
114 Instant Client 사용법 구퍼 2009.12.30 5894
113 COLUMN을 ROW로 운영자 2002.09.18 5858
112 select -> update 구문 샘플 구퍼 2010.01.21 5696
111 그룹 단위별 일련번호 붙이기 운영자 2002.09.18 5668
110 데이타에 한글로 공백이 있는 경우 값을 가져오지 못하고 오류가 발생하는 경우 처리 구퍼 2009.03.23 5584
109 현재의 년월일시분초 구하기 구퍼 2008.09.10 5549
108 Conditions 구퍼 2008.09.17 5544
107 순환구조에서 임시테이블에 하위 조직을 엮어서 넣는 프로시져 하늘과컴 2007.10.01 5204
위로