---- rank 함수
select deptno "부서번호", ename "성명", sal "급여",
    rank() over(order by sal desc) "등수", -- 해당 column의 등수를 준다.
    dense_rank() over(order by sal desc) "서열" --  서열을 나타내 준다.
from emp;

select deptno "부서번호", ename "성명", sal "급여",
    rank() over(partition by deptno order by sal desc) "부서등수",
    -- partition by 는 해당 컬럼별 순위를 나타낸다.
      rank() over(order by sal desc) "등수" -- 해당 column의 등수를 준다.
from emp;

select deptno "부서번호", ename "이름", sal "급여",
    rank() over(partition by deptno order by sal desc) "부서등수",
    rank() over(order by sal desc) "전체등수",
    dense_rank() over(partition by job order by coalesce(sal*12+comm, sal*12, 0) desc) "직종별등수",
    dense_rank() over(order by coalesce(sal*12+comm, sal*12, 0) desc) "전체서열"
from emp
order by 1;

select deptno "부서번호", ename "성명",
    coalesce(sal*12+comm, sal*12, 0) "연봉",
    rank() over(order by coalesce(sal*12+comm, sal*12, 0) desc) "등수"
from emp;

select deptno "부서번호", ename "성명", sal "급여",
    rank() over(order by sal desc) "등수" -- 해당 column의 등수를 준다.
from emp
where rank() over(order by sal desc) <= 5; -- rank 함수는 where절에 사용이 안된다.

'Program... > Oracle' 카테고리의 다른 글

Oracle Group by 절  (0) 2009.03.14
Oracle 단일행 함수와 그룹함수의 차이점  (0) 2009.03.14
Oracle 변환형 함수  (0) 2009.03.13
Oracle 날짜형 함수  (0) 2009.03.13
Oracle 숫자형 함수 - log, sign, chr  (0) 2009.03.13
Posted by Duritz

--- ○ 변환형 함수
--    ↙-- to_number -┐↙--- to_char --┐
-- number            char              date
--   └-- to_char ---↗└-- to_date ---↗

select sysdate,
    to_char(sysdate,'year'),  -- two thousnad seven
    to_char(sysdate,'yyyy'),  -- 2007
    to_char(sysdate,'month'), -- february
    to_char(sysdate,'mon'),   -- feb
    to_char(sysdate,'mm'),    -- 02
    to_char(sysdate,'dd'),    -- 14
    to_char(sysdate,'hh am'), -- 03 오후 
    to_char(sysdate,'hh24'),  -- 15
    to_char(sysdate,'mi'),    -- 39
    to_char(sysdate,'ss'),    -- 43
    to_char(sysdate,'sssss')  -- 56383 : 현재날짜의 0시0분0초로부터 현재까지 지나간 초를 나타낸다.
from dual;

select to_char(sysdate,'day') -- 요일명 표시
from dual;
select to_char(sysdate,'ddd') -- 현재 년도의 첫째일부터 현재날짜까지 지나온 일수를 표시
from dual;
select to_char(sysdate,'dd') -- 현재 달의 첫째일로부터 현재날짜까지 지나온 일수를 표시
from dual;
select to_char(sysdate,'d') -- 현재 주의 첫째일로부터 현재날짜까지 지나온 일수를 표시
from dual;

select to_char(sysdate, 'q') -- 현재 년도의 분기를 표시한다
from dual;

select to_char(sysdate, 'fmyyyy-mm-dd') from dual; -- fm을 표시하면 앞에 숫자0이 포함되면 나타지않는다.
--------- 연습문제 : 오늘의 날짜를 다음 같이 나타내시오. (2007년 2월 14일 수요일)
select to_char(sysdate, 'yyyy') || '년 ' ||  to_char(sysdate, 'fmmm') || '월 ' ||
    to_char(sysdate, 'fmdd') || '일 ' ||to_char(sysdate, 'day') "오늘의 날짜"
from dual;
--------- 연습문제 : 내가 태어난 요일명은 무엇일까?
select to_char(to_date('1981-08-09','yyyy-mm-dd'), 'day') "내가태어난 요일" from dual;

---- 숫자 -> 문자 변환 기타
select 1234567, to_char(1234567, 'L9,999,999') -- 'L9,999,999' 이렇게 입력하면 해당국가의 통화표시가 나온다.
from dual;

select 1234567, to_char(1234567, 'L9,999,999.99') -- 소숫점 표시도 가능하다.
from dual;

select 1234567, to_char(1234567, '09999999') -- 해당 숫자앞에 0을 넣을수도 있다.
from dual;

select ename, to_char(sal, '$9,999') sal
from emp;

select sysdate,
    to_char(sysdate,'yyyy'),  -- to_char 는 문자형태로 보여지므로 왼쪽정렬
    to_char(sysdate,'mm'),
    to_char(sysdate,'dd'),
    extract(year from sysdate),  -- extract는 숫자형태로 보여지므로 오른쪽정렬
    extract(month from sysdate), -- 시, 분, 초는 표시되지 않는다.
    extract(day from sysdate)
from dual;

Posted by Duritz

---- 날짜연산
select sysdate, sysdate + 1, sysdate + 1/24, sysdate + 1/(24*60*60)
from dual;

select '2007-02-14' - '2007-02-12' -- 이러한 형식은 문자로 인식하기 때문에 실행이 안된다.
from dual;
select to_date('2007-02-14','yyyy-mm-dd') -  -- to_date('입력값','x') :  해당값은 X라는 형식의 날짜라고 표시한다.
    to_date('2007-02-12','yyyy-mm-dd')
from dual;
---- months_between 함수 :
select months_between('2007-2-12','2007-01-01') -- 문자 형식이라도 잠정적으로 날짜로 인식한다.
    -- months_between(a,b): a와b의 차이를 달(month)수로 나타낸다.
from dual;

---- add_months 함수
select add_months(sysdate, 1) -- add_months(a,b) : a날짜로부터 b달만큼 더한다.
from dual;
----------- 예제문제 : 지금부터 1달 2일 3시간 4분 5초후는?
select sysdate, add_months(sysdate,1) + 2 + 3/24 + 5/(24*60*60)
from dual;  -- oracle 8i 까지 써왔던 함수.
----------- 예제문제 : 지금부터 1년 1달 2일 3시간 4분 5초후는?
select sysdate, sysdate + to_yminterval('01-01') + to_dsinterval('002 03:04:05')
from dual; -- oracle 9i 부터 나온 시간계산함수

---- next_day 함수 : next_day(날짜,'요일') - 해당날짜에서 가장빨리 돌아오는 요일을 나타낸다.
select next_day(sysdate,'금'),   -- 리눅스,유닉스 기반에서는 요일이 한글이 아닌 영어라 안될수 있다.
       next_day(sysdate,'월'),
       next_day(sysdate,'토요일'),
       next_day(sysdate,'화요일')
from dual;

select to_char(sysdate,'day'), to_char(sysdate,'dy') -- 해당함수는 날짜에대한 요일을 알려준다.
from dual;  -- 유닉스나 리눅스는 한글이 아닌 영어로 나타난다.

select to_char(sysdate, 'd')
from dual;
------ 1, 2, 3, 4, 5, 6, 7
------ 월 화 수 목 금 토 일 로 매핑이 된다.

---- 미리배워보는 (case, when, then, end) 문
select case 3-1                       -- oracle 8i부터 생성된 함수
    when 1 then '3-1=1 입니다.'
    when 2 then '3-2=1 입니다.'
    else '3-1=몰라요'
    end
from dual;

select case
    when 3 > 4 then '3 > 4 입니다.'
    when 3 > 2 then '3 > 2 입니다.'
    else '몰라요'
    end
from dual;

select decode(3-1, 1, '3-1=1 ok', 2, '3-1=2 ok', '3-1= I don`t know')
from dual;   -- 오라클 8i 이전에 사용하던 함수
----------------------------------------------------------------------------------------
---- case~ 함수
select case to_char(sysdate, 'd')
    when '1' then '일요일'
    when '2' then '월요일'
    when '3' then '화요일'
    when '4' then '수요일'
    when '5' then '목요일'
    when '6' then '금요일'
    when '7' then '토요일'
    end "오늘의 요일명"
from dual;

select decode(to_char(sysdate, 'd')
           ,'1','일요일'
           ,'2','월요일'
           ,'3','화요일'
           ,'4','수요일'
           ,'5','목요일'
           ,'6','금요일'
           ,'7','토요일') "오늘의 요일명"
from dual;

---- last_day 함수 : 해당 날짜에 맨 마지막 날을 표시한다.
select last_day(sysdate)
from dual;

'Program... > Oracle' 카테고리의 다른 글

Oracle rank 함수  (0) 2009.03.13
Oracle 변환형 함수  (0) 2009.03.13
Oracle 숫자형 함수 - log, sign, chr  (0) 2009.03.13
Oracle 숫자형 함수 - mod, floor, power, sqrt  (0) 2009.03.13
Oracle 숫자형 함수 - round, trunc  (0) 2009.03.13
Posted by Duritz

공지사항

Yesterday
Today
Total
05-07 16:32

달력

 « |  » 2025.5
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