어떤 테이블에 여러개의 열항목(칼럼)을 행항목(로)으로 변경해야 하는 경우
한 레코드에 여러개의 항목이 있으므로 이를 여러줄의 한 항목으로 만들기 위해서
일단 레코드 뻥튀기(자기복제)를 해야 하고 그걸 위해 임시테이블을 하나 사용합니다.
여기서는 copy_t 라는 이름의 테이블을 사용해봅니다.
copy_t는 어떠한 형태든 상관 없지만 "원하는 갯수의 레코드"를 만들 수 있는 조건이 가능해야 합니다.
한 레코드에 여러개의 항목이 있으므로 이를 여러줄의 한 항목으로 만들기 위해서
일단 레코드 뻥튀기(자기복제)를 해야 하고 그걸 위해 임시테이블을 하나 사용합니다.
여기서는 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)
(
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')
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)
(
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)
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
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 부분)
(인라인뷰의 copy_t 조인, 조인 조건이 없음에 주목하세요...)
뻥튀기 된 레코드 중에서 실제로 읽어야 할 컬럼만 읽도록 합니다.
(case when 부분)
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
» | 테이블 열항목을 행항목으로 변경하는 팁 | 구퍼 | 2011.01.11 | 8835 |
93 | 오라클 DB 링크 만들기 | 구퍼 | 2011.01.06 | 6826 |
92 | select -> update 구문 샘플 | 구퍼 | 2010.01.21 | 5936 |
91 | Instant Client 사용법 | 구퍼 | 2009.12.30 | 6051 |
90 | Conditions | 구퍼 | 2008.09.17 | 5844 |
89 | Basic Delete Statements | 구퍼 | 2008.09.17 | 4671 |
88 | Basic Update Statements | 구퍼 | 2008.09.17 | 4622 |
87 | Unix, Oracle, Pro*C작성 입찰공고 | 운영자 | 2003.06.05 | 4458 |
86 | Unix, Oracle, Pro*C작성 구인구직게시판 | 운영자 | 2003.06.05 | 4887 |
85 | Unix, Oracle, Pro*C작성 자유게시판 | 운영자 | 2003.06.05 | 4745 |
84 | 최단거리찾기 혹은 멀리 떨어진 두지점간의 거리의 합구하기 | 박상현 | 2006.11.07 | 3690 |
83 | PL/SQL에서 쿼리시 Array Processing 처리방법 | 박상현 | 2006.10.27 | 3622 |
82 | 시간선분(선분이력)의 합집합 구하기 | 박상현 | 2006.06.13 | 5159 |
81 | 최대공약수, 최소공배수 구하기 | 박상현 | 2006.06.13 | 3839 |
80 | 문자열에서 특정 단어 갯수 구하기 | 박상현 | 2006.06.13 | 3573 |
79 | 소수(prime number) 구하기 | 박상현 | 2006.06.13 | 3425 |
78 | 달력 생성 쿼리 | 박상현 | 2006.06.13 | 3345 |
77 | 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (2) | 박상현 | 2006.06.13 | 3968 |
76 | 다중 Row 결과를 단일행으로 컴마로 분리해 출력하는 방법 (1) | 박상현 | 2006.06.13 | 3697 |
75 | 문자열 행으로 분리하기 | 박상현 | 2006.06.13 | 3827 |