이름 | 부서번호 | 부서명 | 월급 | 월급날짜 |
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 이건데.. 이거는 너무 많이~~ 작성해줘야해서 다른방법이 없나... 여쭤봅니다 ㅠㅠ
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 테이블에 시작하는 연월 입력하시구요. 대신에 열 명칭은 폼단에서 처리하시구요.
아 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
동적 쿼리는 쿼리에 있는 기능이 아니라 쿼리 구문을 고정으로 만들어 놓는 게 아니고
프로그램단에서 만드는 걸 말하는 거구요. max부분을 프로그램단에서 for문 돌면서 만들면
된다는 걸 말씀드린 거예요.
http://www.gurubee.net/article/19612
이 글 읽어보시면 도움이 될 겁니다. 구글에서 동적쿼리나 dynamic SQL 이렇게도 검색해보시구요.