질문있습니다~~열을 컬럼으로 표현하고싶습니다! 0 9 1,700

by 도지니 [SQL Query] #열#컬럼#어려움.. [2016.11.29 11:36:11]


이름 부서번호 부서명 월급 월급날짜
a 1 sal 100 2012.01
a 1 sal 150 2012.02
a 1 sal 166 2012.03
b 2 to 122 2012.01

월급날짜에 따라 월급을 표현해주고싶습니다!

예를들면 사람마다 5년간의 월급 을 년도별로 보고싶습니다!

이름 | 부서번호 | 부서명 | 2012.01 | 2012.02 | ~~~~~ |2016.12|

 a         1           sal         100        150       ~~~~   200 

 

현재 코드는 MAX(DECODE(월급날짜,'201201',월급))AS Y201201  이건데.. 이거는 너무 많이~~ 작성해줘야해서 다른방법이 없나... 여쭤봅니다 ㅠㅠ

by jkson [2016.11.29 11:52:17]

아까 pivot 알려드렸는데 잘 안 되세요? 아 연도가 1해 연도가 아니라 몇년에 걸쳐서인가보네요?

pivot (max(col5) val for col6 in ('2012.02' mon02,'2012.03' mon03,'2012.04' mon04,'2012.05' mon05, '2012.06' mon06,'2012.07' mon07))

=> in 부분을 조회 조건에 따라 동적으로 변경해주시면 됩니다.


by 도지니 [2016.11.29 12:34:40]

pivot은 오라클버전이 9i라 안되더라구요 ㅠㅠㅠ


by jkson [2016.11.29 12:15:19]
with t aswith t as
(
select 'A' col1, '1' col2,  '30' col3, 'B' col4,  '500' col5, '2012.02' col6 from dual union all
select 'A' col1, '1' col2,  '30' col3, 'B' col4,  '650' col5, '2012.03' col6 from dual union all
select 'A' col1, '1' col2,  '30' col3, 'B' col4,  '620' col5, '2012.04' col6 from dual union all
select 'A' col1, '1' col2,  '30' col3, 'B' col4,  '530' col5, '2012.05' col6 from dual union all
select 'A' col1, '1' col2,  '30' col3, 'B' col4,  '510' col5, '2012.06' col6 from dual union all
select 'A' col1, '1' col2,  '30' col3, 'B' col4,  '490' col5, '2012.07' col6 from dual union all
select 'B' col1, '1' col2,  '30' col3, 'B' col4,  '490' col5, '2012.07' col6 from dual union all
select 'A' col1, '1' col2,  '30' col3, 'B' col4,  '490' col5, '2012.09' col6 from dual
)
, cal as
(select to_char(add_months(to_date('20120101','yyyymmdd'), level - 1),'yyyy.mm') mon, level rn
   from dual connect by level <= 60)
select *
  from
    (
    select col1, col2, col3, col4, col5,  b.rn
      from t a, cal b
      where a.col6 = b.mon
    )
pivot (max(col5) val for rn in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
                               ,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60))

5년 고정이면 이렇게 하셔도 될 것 같네요. cal 테이블에 시작하는 연월 입력하시구요. 
대신에 열 명칭은 폼단에서 처리하시구요.

 

 


by jkson [2016.11.29 13:05:00]

아 9i 쓰시는군요. max decode 밖에 생각이 안나네요. 5년 고정이시면 아크로에디터 같은 툴로 열블럭 설정하시고 한방에 입력하시면 좀 쉬울 거 같구요.(숫자 증가 부분은 엑셀에서 드래그로 만들어서 복사 붙여넣기 하시면 쉽습니다.)

동적쿼리로 해당 열을 60개 만들어주는 방법도 있어요.

select col1, col2, col3, col4
     , max(decode(rn,1,col5)) mon01-> 요 부분을 for문 돌면서 만들어줌.
  from
    (
    select col1, col2, col3, col4, col5,  b.rn
      from t a, cal b
      where a.col6 = b.mon
    )
group by col1, col2, col3, col4 

 


by 도지니 [2016.11.29 13:14:22]

max(decode(rn,1,col5)) mon01-> 요 부분을 for문 돌면서 만들어줌

이부분이 궁금합니다 for 문을 설정해줘야하는거지않나여??


by jkson [2016.11.29 13:20:50]

동적 쿼리는 쿼리에 있는 기능이 아니라 쿼리 구문을 고정으로 만들어 놓는 게 아니고

프로그램단에서 만드는 걸 말하는 거구요. max부분을 프로그램단에서 for문 돌면서 만들면

된다는 걸 말씀드린 거예요.

http://www.gurubee.net/article/19612

이 글 읽어보시면 도움이 될 겁니다. 구글에서 동적쿼리나 dynamic SQL 이렇게도 검색해보시구요.


by 도지니 [2016.11.29 13:31:48]

하아..ㅠㅠ 너무어렵네요 ㅠㅠ

그나마 결과값 뽑은거를 다시 행으로 고치려니;;;

1년에 5만건인데.....

 


by 마농 [2016.11.29 13:51:39]

음. 60개 항목이 필요하다면 60번 적어줄수밖에 없습니다.
편집기(에티터) 시용법에 익숙해 지시면 그닥 어렵지 않습니다.
아니면 출력 형태를 바꿔야지요.
60개 항목 나열은 좀 심하죠.


by 도지니 [2016.11.29 13:57:48]

ㅠㅠㅠ 그러니까요..... 시간도 너무많이잡아먹고 결과값이 맞긴한데 참 이걸 어떻게 표현하기가 애매하네요 ㅠㅠㅠ 

1년주기로 끊어서 표현을 하면 참 괜찮을거같은데;;

굳이 다 보셔야한다니.. 어쩔수없죠..

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