http://www.oracle.com/technology/software/tech/windows/ora_mts/htdocs/utilsoft.html
'oracle'에 해당되는 글 4건
- 2008.11.01 DLL 'oramts.dll'을(를) 로드할 수 없습니다. 지정된 모듈을 찾을 수 없습니다.
- 2007.06.24 Oracle 달력 쿼리
- 2007.06.24 Oracle 분석함수
- 2007.06.23 Oracle 10g 기본으로 있는 HR계정을 이용한 예제 1
http://www.oracle.com/technology/software/tech/windows/ora_mts/htdocs/utilsoft.html
년도와 월이 주어졌을 경우, 해당 월의 달력을 생성해주는 쿼리를 만들어 보자.
쿼리는 아래와 같다. (2000년 01월이 주어졌을 경우)
SELECT MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
FROM (SELECT base_mon + LEVEL - 1 days,
( TRUNC (base_mon + LEVEL - 1, 'd')
- TRUNC (TRUNC (base_mon + LEVEL - 1, 'y'), 'd')
) / 7 + 1 week_grp
FROM (SELECT TO_DATE ('200001', 'yyyymm') base_mon
FROM DUAL)
CONNECT BY base_mon + LEVEL - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp
connect by level 절을 사용하지 못하는 버전일 경우에는, 아래와 같이 dict 테이블을 이용한다.
아래 예는 위의 쿼리 와는 다르게 오늘로부터 몇달 후인지를 나타내는 변수 :n에 따라 달력을 생성한다.
(:n=-1 일 경우 지난달, 0은 이번달, 1은 다음달, 2는 다다음달,...)
SELECT MIN (DECODE (TO_CHAR (days, 'd'), 1, TO_CHAR (days, 'fmdd'))) 일,
MIN (DECODE (TO_CHAR (days, 'd'), 2, TO_CHAR (days, 'fmdd'))) 월,
MIN (DECODE (TO_CHAR (days, 'd'), 3, TO_CHAR (days, 'fmdd'))) 화,
MIN (DECODE (TO_CHAR (days, 'd'), 4, TO_CHAR (days, 'fmdd'))) 수,
MIN (DECODE (TO_CHAR (days, 'd'), 5, TO_CHAR (days, 'fmdd'))) 목,
MIN (DECODE (TO_CHAR (days, 'd'), 6, TO_CHAR (days, 'fmdd'))) 금,
MIN (DECODE (TO_CHAR (days, 'd'), 7, TO_CHAR (days, 'fmdd'))) 토
FROM (SELECT base_mon + ROWNUM - 1 days,
( TRUNC (base_mon + ROWNUM - 1, 'd')
- TRUNC (TRUNC (base_mon + ROWNUM - 1, 'y'), 'd')
)
/ 7
+ 1 week_grp
FROM (SELECT TRUNC (ADD_MONTHS (SYSDATE, :n), 'mm') base_mon
FROM DUAL), dict
WHERE base_mon + ROWNUM - 1 <= LAST_DAY (base_mon))
GROUP BY week_grp
ORDER BY week_grp
Oracle 10g에 포함된 HR(Human Resource) 계정을 이용해 해본 예제들입니다.
오라클 10g를 공부하신다면 아래 예제들을 한번씩 해보시기 바랍니다. ^ ^
1. 1998년에 입사한 사원의 정보를 얻자
사번, 이름, 날자
SELECT EMPLOYEE_ID, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE HIRE_DATE>='1998/01/01' AND HIRE_DATE<'1999/01/01'
SELECT EMPLOYEE_ID, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE HIRE_DATE BETWEEN '1998/01/01' AND '1999/01/01'
SELECT EMPLOYEE_ID, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE HIRE_DATE LIKE '98%'
SELECT EMPLOYEE_ID, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'YYYY') = '1998'
2. 직무가 SALES(영업) 부분에 속하는 사원 중에서 급여가 $10000 미만인 사
원의 정보를 얻자.
사번, 이름, 직무, 급여
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, SALARY
FROM EMPLOYEES
WHERE JOB_ID IN('SA_MAN', 'SA_REP') AND SALARY<10000;
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, SALARY
FROM EMPLOYEES
WHERE (JOB_ID='SA_MAN', JOB_ID='SA_REP') AND SALARY<10000;
SELECT EMPLOYEE_ID, LAST_NAME, JOB_ID, SALARY
FROM EMPLOYEES
WHERE JOB_ID LIKE 'SA_%' AND SALARY<10000;
3. 부서 아이디별로 해당 부서의 평균 급여를 얻자.
평균 급여가 많은 순으로 정렬하자.
부서아이디, 평균급여
SELECT DEPARTMENT_ID, AVG(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID NOT IN(40, 50)
GROUP BY DEPARTMENT_ID
ORDER BY AVG(salary) DESC
SELECT DEPARTMENT_ID, AVG(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING DEPARTMENT_ID NOT IN(40, 50)
ORDER BY AVG(salary) DESC
4. 18.325 소수 둘째자리에서 반올림 처리하자.
SELECT ROUND(18.325, 1) "Round"
FROM dual;
5. 날자를 문자로 변환
SELECT TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS') today
FROM dual
6. 월별 입사자의 합계를 나타내 보자.
SELECT TO_CHAR(HIRE_DATE,'MM') "월", COUNT(*)
FROM EMPLOYEES
GROUP BY TO_CHAR(HIRE_DATE,'MM')
ORDER BY "월"
7. 분기별 입사자의 합계를 나타내 보자.
SELECT TO_CHAR(HIRE_DATE,'Q') "분기", COUNT(*)
FROM EMPLOYEES
GROUP BY TO_CHAR(HIRE_DATE,'Q')
ORDER BY "분기"
SELECT case
when TO_CHAR(hire_date, 'MM')='01' then '1'
when TO_CHAR(hire_date, 'MM')='02' then '1'
when TO_CHAR(hire_date, 'MM')='03' then '1'
when TO_CHAR(hire_date, 'MM')='04' then '2'
when TO_CHAR(hire_date, 'MM')='05' then '2'
when TO_CHAR(hire_date, 'MM')='06' then '2'
when TO_CHAR(hire_date, 'MM')='07' then '3'
when TO_CHAR(hire_date, 'MM')='08' then '3'
when TO_CHAR(hire_date, 'MM')='09' then '3'
when TO_CHAR(hire_date, 'MM')='10' then '4'
when TO_CHAR(hire_date, 'MM')='11' then '4'
else '4'
end
, count(employee_id)
FROM EMPLOYEES
GROUP BY case
when TO_CHAR(hire_date, 'MM')='01' then '1'
when TO_CHAR(hire_date, 'MM')='02' then '1'
when TO_CHAR(hire_date, 'MM')='03' then '1'
when TO_CHAR(hire_date, 'MM')='04' then '2'
when TO_CHAR(hire_date, 'MM')='05' then '2'
when TO_CHAR(hire_date, 'MM')='06' then '2'
when TO_CHAR(hire_date, 'MM')='07' then '3'
when TO_CHAR(hire_date, 'MM')='08' then '3'
when TO_CHAR(hire_date, 'MM')='09' then '3'
when TO_CHAR(hire_date, 'MM')='10' then '4'
when TO_CHAR(hire_date, 'MM')='11' then '4'
else '4'
end
8. 영업에 관한 직무를 다음과 같이 나타내 보자.
SA_MAN -> Sales Dept
SA_REP -> Sales Dept
기타 부서 -> Another Dept
SELECT employee_id, last_name, job_id,
case job_id
when 'SA_REP'
then 'Sales Dept'
when 'SA_MAN'
then 'Sales Dept'
else 'Another Dept'
end case
FROM EMPLOYEES
WHERE job_id LIKE 'S%'
9. SELECT employee_id, department_id, salary
FROM employees
WHERE department_id IN(10, 20, 30)
위 쿼리를 통해 자신이 속한 부서의 평균급여를 추가적으로 출력한다.
SELECT employee_id
, department_id
, salary
, AVG(salary) OVER(PARTITION BY department_id) "AVG_SALARY"
--AVG(expr) OVER(analytical clause)
FROM employees
WHERE department_id IN(10, 20, 30)
10. 급여를 5000 받는사람이 급여의 순위가 상위 몇번째인가
SELECT RANK(5000) WITHIN GROUP(ORDER BY salary DESC) "RANK"
FROM employees