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 40043 게시물 읽기
No. 40043
가로를 분리 하여 세로로 부탁드립니다.
작성자
감사합니다
작성일
2013-03-11 19:11
조회수
7,703

with t as (
select 'a'   a, 1 b, 2 c, 3 d, 'eeee' e from dual union all
select 'aa'  a, 2 b, 3 c, 1 d, 'ffff' e from dual union all
select 'aaa' a, 3 b, 1 c, 2 d, 'gggg' e from dual)
select *
  from t;

이런 데이터를 아래와 같이 변형을 하고자 합니다.

a   b eeee
a   c eeee
a   d eeee

aa  d ffff
aa  b ffff
aa  c ffff

aaa c gggg
aaa d gggg
aaa b gggg

컬럼 a 별로 b,c,d 가 분리가 되어서 각각의 컬럼의 순위 별로 1,2,3을 매기는 겁니다.
select level lv from dual connect by level <= 3 이걸로 행을 늘린다음에 조건을 걸어야
할거 같은데 도통 생각이 나질 않습니다...
부탁좀 드리겠습니다.

이 글에 대한 댓글이 총 5건 있습니다.
SELECT a, DECODE(lv, 1, b, 2, c, 3, d) bcd, e 
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3)
 ORDER BY a, bcd    
아린(arin76)님이 2013-03-11 20:57에 작성한 댓글입니다.

답변 달아 주신 아린님 감사합니다.

.

하지만 답변 달아 주신 사항에서는 1,2,3 이 나오는데 제가 원하는것은

그 1,2,3 에 대한 a,b,c의 값을 분리 시키는 것입니다.

1,2,3 이 a,b,c 중 어떤것으로 보여 주느냐가 제가 드렸던 질문입니다.

 

감사합니다님이 2013-03-11 21:14에 작성한 댓글입니다. Edit

 b ,c, d 는 컬럼명 아닌가요? 

컬럼명을 보여주고 싶으신건지, 컬럼명이 고정적이라면 아래와 같이 정해주면 되고요.
 
SELECT a
     , DECODE(lv, 1, b, 2, c, 3, d) bcd
     , DECODE(lv, 1, 'b', 2, 'c', 3, 'd') bcd_2
     , e 
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3)
 ORDER BY a, bcd   
아린(arin76)님이 2013-03-11 21:38에 작성한 댓글입니다.

답변 달아 주신 아린님 감사합니다.

제 질문이 좀 이상했나 봅니다.

---------------------
--원데이터
with t as (
select 'a'    a, 1 b, 2 c, 3 d, 'eeee' e from dual union all
select 'aa'   a, 2 b, 3 c, 1 d, 'ffff' e from dual union all
select 'aaa'  a, 3 b, 1 c, 2 d, 'gggg' e from dual
)
select a, b,c,d,e
  from t;
  
--원하는값 
with t as (
select 'a'    a, 'b' 순위, 'eeee' e from dual union all
select 'a'    a, 'c' 순위, 'eeee' e from dual union all
select 'a'    a, 'd' 순위, 'eeee' e from dual union all
select 'aa'   a, 'd' 순위, 'ffff' e from dual union all
select 'aa'   a, 'b' 순위, 'ffff' e from dual union all
select 'aa'   a, 'c' 순위, 'ffff' e from dual union all
select 'aaa'  a, 'c' 순위, 'gggg' e from dual union all
select 'aaa'  a, 'd' 순위, 'gggg' e from dual union all
select 'aaa'  a, 'b' 순위, 'gggg' e from dual

select *
  from t;

b,c,d 컬럼은 각각 컬럼의 순위가 들어가 있습니다. 한 로우를 이 각각의 컬럼 수 만큼 로우를 추가 한 후
추가된 로우에 각각의 순위별로 1순위 컬럼 , 2순위 컬럼, 3순위 컬럼이 나오게 하는것을 원했습니다.
조건을 거는게 생각이 잘 나질 않아서 고민중이라서 도움을 얻고저 이렇게 글을 남겼습니다.
 

감사합니다님이 2013-03-12 09:49에 작성한 댓글입니다. Edit

with t as (
select 'a'    a, 1 b, 2 c, 3 d, 'eeee' e from dual union all
select 'aa'   a, 2 b, 3 c, 1 d, 'ffff' e from dual union all
select 'aaa'  a, 3 b, 1 c, 2 d, 'gggg' e from dual
)
select a.a
     , case when a.rn = a.b then 'b'
            when a.rn = a.c then 'c'
            when a.rn = a.d then 'd'
       end as sort_o
     , a.e
  from (
        select a, b,c,d,e
             , ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) AS RN
          from t
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3)    
        ) a 
;

 

위와 같이 일단 무자비하게 하긴 처리하긴 했습니다. 좀더 좋은 방법이 있으면

알려주시면 감사하겠습니다.

감사합니다님이 2013-03-12 13:14에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40047NULL과 '' 비교관련 [1]
mb
2013-03-13
5359
40046날짜이력 기간별 최소일자,최대일자 [1]
정@@
2013-03-13
6246
40045B테이블값을 A테이블로 업데이트 조건같은경우만.. [2]
겜블러
2013-03-12
5328
40043가로를 분리 하여 세로로 부탁드립니다. [5]
감사합니다
2013-03-11
7703
40042case when 에서 결합연산자 사용질문입니다. [3]
서기라
2013-03-08
5883
40041연속된 동일문자열 찾기 [4]
햇살좋은오후
2013-03-07
8093
40040BLOB 입력처리 C++소스 문의
정현도
2013-03-06
5340
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다