본문 바로가기

닷컴's_열공/Database

오라클에서 3개의 row을 1개의 column으로 나오게 하는방법

오라클에서 3개의 row을 1개의 column으로 나오게 하는방법

p546211 2006.09.09 16:38

답변 1| 조회 1,836

'갑' 이라는 사람의 담당간호사가 있고 질병이 여래개(고혈압,당뇨 등) 있을 때

sql 사용하여 조회시  예시1 같이 나오지 않고 예시2처럼 나오게 하는 방법은 없나요 

 예시1)

no  대상자   담당간호사       질병

1      갑            홍길동           고혈압

2      갑            홍길동           당뇨

 

 예시2)

no  대상자   담당간호사       질병

1      갑            홍길동           고혈압/당뇨

  

신고

의견 쓰기

질문자 채택된 경우, 추가 답변 등록이 불가합니다.

질문자 선택

re: 오라클에서 3개의 row을 1개의 column으로 나오게 하는방법

hahmyk

답변채택률 83.3%

2006.09.11 19:41

imsi 테이블에 담과 같은 샘플 로우를 넣어 보았습니다.

select * from imsi ;

        NO TYPE                 NAME                 BYUNG
---------- -------------------- -------------------- ----------------------------------------
         1 갑                   영포                 감기
         2 갑                   영포                 몸살
         3 갑                   영포                 충치
         4 갑                   금와                 충치
         5 갑                   금와                 당뇨
         6 갑                   주몽                 과대망상증
         7 갑                   소서노               공주병
         8 갑                   소서노               공한증
         9 갑                   연타발               결벽증
        10 갑                   대소                 정신착란
        11 갑                   대소                 결핵
        12 갑                   대소                 스트레스
        13 갑                   대소                 흑사병

13 개의 행이 선택되었습니다.

 

그룹별 랭킹을 구합니다

select A.*, row_number() over(partition by name order by byung) CNT from imsi A;

       NO TYPE                 NAME                 BYUNG                                           CNT
---------- -------------------- -------------------- ---------------------------------------- ----------
         5 갑                   금와                 당뇨                                              1
         4 갑                   금와                 충치                                              2
        11 갑                   대소                 결핵                                              1
        12 갑                   대소                 스트레스                                          2
        10 갑                   대소                 정신착란                                          3
        13 갑                   대소                 흑사병                                            4
         7 갑                   소서노               공주병                                            1
         8 갑                   소서노               공한증                                            2
         9 갑                   연타발               결벽증                                            1
         1 갑                   영포                 감기                                              1
         2 갑                   영포                 몸살                                              2
         3 갑                   영포                 충치                                              3
         6 갑                   주몽                 과대망상증                                        1

13 개의 행이 선택되었습니다.

 

한 사람이 갖을 수 있는 질병의 갯 수 만큼 디코딩 합니다.

select type,name,decode(cnt,1,byung)  ,

           decode(cnt,2,byung) ,decode(cnt,3,byung) ,decode cnt,4,byung) 
from (select A.*, row_number() over(partition by name order by byung) CNT from imsi A);

TYPE                 NAME                 DECODE(CNT,1,BYUNG)                      DECODE(CNT,2,BYUNG)                      DECODE(CNT,3,BYUNG)                      DECODE(CNT,4,BYUNG)
-------------------- -------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
갑                   금와                 당뇨
갑                   금와                                                          충치
갑                   대소                 결핵
갑                   대소                                                          스트레스
갑                   대소                                                                                                   정신착란
갑                   대소                                                                                                                                            흑사병
갑                   소서노               공주병
갑                   소서노                                                        공한증
갑                   연타발               결벽증
갑                   영포                 감기
갑                   영포                                                          몸살
갑                   영포                                                                                                   충치
갑                   주몽                 과대망상증

13 개의 행이 선택되었습니다.

 

디코딩한 칼럼별로 그룹함수를 적용합니다.

select type,name,max(decode(cnt,1,byung)),max(decode(cnt,2,byung)),max(decode(cnt,3,byung)),max(decode(cnt,4,byung)) 
from (select A.*, row_number() over(partition by name order by byung) CNT from imsi A) group by TYPE,name ;

 

TYPE                 NAME                 MAX(DECODE(CNT,1,BYUNG))                 MAX(DECODE(CNT,2,BYUNG))                 MAX(DECODE(CNT,3,BYUNG))                 MAX(DECODE(CNT,4,BYUNG))
-------------------- -------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
갑                   소서노               공주병                                   공한증
갑                   주몽                 과대망상증
갑                   대소                 결핵                                     스트레스                                 정신착란                                 흑사병
갑                   금와                 당뇨                                     충치
갑                   연타발               결벽증
갑                   영포                 감기                                     몸살                                     충치

6 개의 행이 선택되었습니다.

 

그 담에 필요한 컬럼들을 concatenation합니다....

 

돔이 되시길....

그룹함수는 조건에 맞는 로가 많을 경우 속도가 느려짐에 유의하시길....