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 37855 게시물 읽기
No. 37855
쿼리질문...세로데이타..가로로나타내기...
작성자
김옥희(okhee77)
작성일
2010-08-16 10:41
조회수
3,792

세로데이타...가로로 나타내기...

with test as
(
select 'B1' as col1, 'A' as col2, 1 as col3 from dual
union all
select 'B1', 'A' , 2  from dual
union all
select 'B1', 'A' , 3  from dual
union all
select 'B1', 'B' , 4  from dual
union all
select 'B1', 'B' , 5  from dual
union all
select 'B1', 'C' , 6  from dual
)
test 라는 테이블 데이타가 아래처럼 들어있습니다...
col1 col2 col3
------------------------------------
B1     A      1
B1     A      2
B1     A      3
B1     B      4
B1     B      5
B1     C      6

위처럼 되어있는 데이타를...아래처럼 나오게 하려고 합니다...

col1 a_col b_col c_col
----------------------------------------------
B1       1        4           6
B1       1        5           6
B1       2        4           6
B1       2        5           6
B1       3        4           6
B1       3        5           6


쿼리는...
select a.col1, a.col3 a_col, b.col3 b_col, c.col3 c_col
from test a, test b, test c
where a.col1=b.col1
and a.col1=c.col1
and a.col2='A' and b.col2='B' and c.col2='C'
order by a.col3, b.col3, c.col3

으로 하면 나옵니다만...
질문은...위 쿼리처럼...셀프조인이 여러번 들어가는데...
col2의 항목갯수만큼 셀프조인이 들어가게 됩니다...
위 예제는 col2가 단지 3개뿐이지만...50개까지도 늘어날수 있는거라...
셀프조인을 50번을 한다면...ㅡㅡ;;
성능상 이슈가 있어서요....
셀프조인 없이...해결할 수 있는방법이나...조은방법이 없을까요...
 

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

열 자료는 고정적으로 그 값들을 알고 있어야만 합니다.
테이블 구조에서 가변적으로 열을 표시하는것은 아직까지는 불가능한걸로 압니다.
다음은 하나의 열에 데이터만 구분자로 구분하여 표시하는 방법입니다.


WITH test AS
(
SELECT 'B1' col1, 'A' col2, 1 col3 FROM dual
UNION ALL SELECT 'B1', 'A', 2 FROM dual
UNION ALL SELECT 'B1', 'A', 3 FROM dual
UNION ALL SELECT 'B1', 'B', 4 FROM dual
UNION ALL SELECT 'B1', 'B', 5 FROM dual
UNION ALL SELECT 'B1', 'C', 6 FROM dual
)
SELECT col1
     , SUBSTR(SYS_CONNECT_BY_PATH(col3, '-'),2) col4
  FROM (SELECT col1, col2, col3
             , DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2) dr
             , COUNT(DISTINCT col2) OVER(PARTITION BY col1) cnt
          FROM test
        )
 WHERE LEVEL = cnt
 START WITH dr = 1
 CONNECT BY PRIOR col1 = col1
        AND PRIOR dr = dr - 1
;

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

와우~

멋지십니다...

정말 고맙습니다~~

많이 배워갑니다...^^

김옥희(okhee77)님이 2010-08-16 14:11에 작성한 댓글입니다.
이 댓글은 2010-08-16 14:12에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
37858index scan 이 되지 않고 있습니다. [6]
what
2010-08-16
4241
37857리플 관련 간단한 질문 드립니다 [2]
ㄱㄱㄱ
2010-08-16
2818
37856SERVICE_NAME에 Database 명을 입력하면 되나요?
용세중
2010-08-16
2526
37855쿼리질문...세로데이타..가로로나타내기... [2]
김옥희
2010-08-16
3792
3785411g 인데 trc 파일이 무지하게 떨어 집니다. 도와주세요.
박철
2010-08-14
3326
37851Row 생성하기..세번째 [3]
아폴론
2010-08-13
3304
37850Row 생성하기..한번더요.. [3]
아폴론
2010-08-13
2691
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다