행을 열으로 변환하기 0 2 1,883

by 쌈장묵자 [SQL Query] [2016.04.06 10:51:59]


이름 학교 과목 기간 수료여부 신분
박나래 무궁화초등 수학 1년 수료 학생
박나래 무궁화초등 과학 8월 수료 학생
박나래 무궁화초등 영어 10월 수료 학생
홍길동 무궁화고등 영어 1년 수료 선생
홍길동 무궁화고등 영어 6월 수료 선생

이 같은 데이터를

이름 학교 과목 수료여부 신분
박나래 무궁화초등 수학,과학,영어 수료 2년 6월 학생
홍길동 무궁화고등 영어 수료 1년 6월 선생

이런식으로 데이터를 뽑고 싶습니다 기준은 이름이 되고 과목의 데이터가 다른 열을 하나의 열로 바꿔주고

수료여부와 기간을 합쳐서 수료 합산년수 로 하고 싶은데 어떤식으로 쿼리를 짜야 할가요?

항상 나래비를 세워서 여러 열을 하나의 열로 바꿔 주는 것이 어렵네요 ;; 도움 부탁 드립니다

 

 

by swlee [2016.04.06 11:28:32]
with t (이름, 학교, 과목, 기간, 수료여부, 신분) as ( 
select '박나래','무궁화초등','수학','1년','수료','학생' from dual union all
select '박나래','무궁화초등','과학','8월','수료','학생' from dual union all
select '박나래','무궁화초등','영어','10월','수료','학생' from dual union all
select '홍길동','무궁화고등','영어','1월','수료','선생' from dual union all
select '홍길동','무궁화고등','영어','6월','수료','선생' from dual)
select 이름, 학교, 과목, '수료 '||case when 수료 < 12 then mod(수료,12)||'개월' 
                                     when mod(수료,12) = 0 then trunc(수료/12)||'년' 
                                     else trunc(수료/12)||'년'||mod(수료,12)||'개월' end 수 
    , 신분
from (
      select 이름,학교
            , Listagg(과목, ',') Within Group (Order By rownum) 과목
            , sum(decode(substr(기간,-1,1),'년',to_number(replace(기간,'년','')) * 12,'월',to_number(replace(기간,'월','')))) 수료
            , min(신분) 신분
      from t
      group by 이름,학교);

 


by 쌈장묵자 [2016.04.06 14:00:33]

시스템이 10g여서 xmlagg를 이용해서 해결 했습니다 많음 도움 주셔서 감사합니다 ㅎㅎ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입