문제1)달력만들기를 해봅시다!!
SQL>select level cnt,trunc(sysdate,'mm') sday
from dual
connect by level<=LAST_DAY(SYSDATE)-trunc(sysdate,'mm')+1;
마지막날짜 2015-02-28일에서 현재날짜에서 달로 TRUNC한 2015-02-01을 뺀 후 1을 더해주면
28일이라는 해당달의 숫자가 나온다.
그 숫자를 connect by level절에 이용하여 일수에 LEVEL 을 붙여준다.
그럼 해당달의 날수를 뽑을 수 있다.
28일이라는 해당달의 숫자가 나온다.
그 숫자를 connect by level절에 이용하여 일수에 LEVEL 을 붙여준다.
그럼 해당달의 날수를 뽑을 수 있다.
해당달의 첫날(sday) 2015-02-01에서 CNT숫자(level)를 더해준 후(만약 5일이면 5을 더해줌)
2015-02-06 일에서 다시 1을 빼주면 해당일인 2015-02-05일이 나오고 TO_CHAR로 변환해주었을때
그날이 일요일이면 1을 리턴하므로 DECODE문을 이용하여 to_char(sday+cnt-1,'d') 이것이 1이면 1을 cnt값을 리턴하도록 하면 된다.
일요일만 뽑아보면 다음과 같이 나온다.
SQL>SELECT decode(to_char(sday+cnt-1,'d'),1,cnt) 일
FROM(select level cnt,trunc(sysdate,'mm') sday
FROM(select level cnt,trunc(sysdate,'mm') sday
from dual
connect by level<=LAST_DAY(SYSDATE)-trunc(sysdate,'mm')+1);
위와같이 월~토 까지도 to_char 리턴값을 이용하여 구해준다.
이제 공백부분을 없애야 하기에 그룹을 묶어줘야 하는데 해당 날짜를 d형식으로 trunc 해주면
해당주의 첫번째 요일의 일자가 나오므로 그 일자별로 묶어줄수 있게된다. trunc(sday+cnt-1,'d')
그룹의 컬럼별로 MAX값을 얻어오고 7번컬럼 기준으로 order by 하면 완성!!(7번값이 null인 경우는 없음)
해당주의 첫번째 요일의 일자가 나오므로 그 일자별로 묶어줄수 있게된다. trunc(sday+cnt-1,'d')
그룹의 컬럼별로 MAX값을 얻어오고 7번컬럼 기준으로 order by 하면 완성!!(7번값이 null인 경우는 없음)
SQL>SELECT max(decode(to_char(sday+cnt-1,'d'),1,A.cnt)) 일,
max(decode(to_char(sday+cnt-1,'d'),2,A.cnt)) 월,
max(decode(to_char(sday+cnt-1,'d'),3,A.cnt)) 화,
max(decode(to_char(sday+cnt-1,'d'),4,A.cnt)) 수,
max(decode(to_char(sday+cnt-1,'d'),5,A.cnt)) 목,
max(decode(to_char(sday+cnt-1,'d'),6,A.cnt)) 금,
max(decode(to_char(sday+cnt-1,'d'),7,A.cnt)) 토
FROM (select level cnt,trunc(to_date('15/2/03'),'mm') sday
from dual
connect by level<=LAST_DAY(to_date('15/2/03'))-trunc(to_date('15/2/03'),'mm')+1) A
group by trunc(sday+cnt-1,'d')
order by 7;
max(decode(to_char(sday+cnt-1,'d'),2,A.cnt)) 월,
max(decode(to_char(sday+cnt-1,'d'),3,A.cnt)) 화,
max(decode(to_char(sday+cnt-1,'d'),4,A.cnt)) 수,
max(decode(to_char(sday+cnt-1,'d'),5,A.cnt)) 목,
max(decode(to_char(sday+cnt-1,'d'),6,A.cnt)) 금,
max(decode(to_char(sday+cnt-1,'d'),7,A.cnt)) 토
FROM (select level cnt,trunc(to_date('15/2/03'),'mm') sday
from dual
connect by level<=LAST_DAY(to_date('15/2/03'))-trunc(to_date('15/2/03'),'mm')+1) A
group by trunc(sday+cnt-1,'d')
order by 7;
2월출력
5월출력
'개발하자 > ORACLE' 카테고리의 다른 글
행과 열 바꾸기 (0) | 2015.02.14 |
---|---|
사원의 급여와 부서별 소계 및 총계 출력하기 (0) | 2015.02.14 |
최대값과 최소값 제외한 평균,총합 구하기(GREATEST,LEAST) (0) | 2015.02.09 |
문자만 자르기(정규식함수 사용-REGEXP_SUBSTR) (0) | 2015.02.09 |
컬럼 가로세로 바꾸기 (0) | 2015.02.09 |