위치를 지정해 반올림하는 round, 지정한 위치에서 버림을 하는 trim,
지정한 숫자에서 올림을 하는 ceil, 버림을 하는 floor,
나머지 값을 구하는 mod
select
round(1234.4), -- 1234
round(1234.5), -- 1235
round(1234.5678, 2), -- 1234.57
round(1234,-1), -- 1230
round(1235,-1), -- 1240
trunc(1234.4), -- 12324
trunc(1234.5), -- 1234
trunc(1234.5678, 2), -- 1234.56
trunc(1234,-1), -- 1230
trunc(1235,-1) -- 1230
from dual;
select ceil(3.14), -- 4
floor (3.14), -- 3
ceil(-3.14), -- -3
floor(-3.14) -- -4
from dual;
select
floor(7/3), -- 2
mod(7, 3) -- 1
from dual;
날짜 출력하는 sysdate
select sysdate as now, -- 오늘 날짜 출력
sysdate-1 as yesterday, -- 어제 날짜 출력
sysdate+1 as tomorrow -- 내일 날짜 출력
from dual;
select sysdate, -- 오늘 날짜 출력
add_months(sysdate, 3) -- 3개월 뒤 날짜 출력
from dual;
where와 having의 차이
where: 앞의 select 제한,
having: group 된 결과를 제한
SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
WHERE SAL <=3000
GROUP BY DEPTNO, JOB
HAVING AVG(SAL) >=2000
ORDER BY DEPTNO, JOB;
--OUTPUT
DEPTNO JOB AVG(SAL)
---------- --------- ----------
10 MANAGER 2450
20 ANALYST 3000
20 MANAGER 2975
30 MANAGER 2850
그룹화한 데이터의 합계를 구하기 - ROLLUP
-- 각 부서마다의 합계가 나오며, 가장 마지막 줄에 총계가 출력됨.
SELECT COUNT(*), DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);
--OUTPUT
COUNT(*) DEPTNO JOB SUM(SAL)
---------- ---------- --------- ----------
1 10 CLERK 1300
1 10 MANAGER 2450
1 10 PRESIDENT 5000
3 10 8750 --DEPTNO 10
2 20 CLERK 1900
2 20 ANALYST 6000
1 20 MANAGER 2975
5 20 10875 --DEPTNO 20
1 30 CLERK 950
1 30 MANAGER 2850
4 30 SALESMAN 5600
6 30 9400 --DEPTNO 30
14 29025 --총계
-- 총계를 제외한 각 부서마다의 합계가 출력됨
SELECT COUNT(*), DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO, ROLLUP(JOB);
--OUTPUT
COUNT(*) DEPTNO JOB SUM(SAL)
---------- ---------- --------- ----------
1 10 CLERK 1300
1 10 MANAGER 2450
1 10 PRESIDENT 5000
3 10 8750 --DEPTNO 10
2 20 CLERK 1900
2 20 ANALYST 6000
1 20 MANAGER 2975
5 20 10875 --DEPTNO 20
1 30 CLERK 950
1 30 MANAGER 2850
4 30 SALESMAN 5600
6 30 9400 --DEPTNO 30
1. DEPTNO, JOB로 정렬했다.
2. DEPTNO로 정렬 후, 같은 DEPTNO를 그룹화해 JOB을 기준으로 정렬(최대, 최소, 평균값)을 계산해 출력한다.
3. JOB으로 정렬 후, 같은 JOB을 그룹화해 DEPTNO를 기준으로 정렬(최대, 최소, 평균값)을 계산해 출력한다.
4. DEPTNO로 정렬 후, 같은 DEPTNO를 그룹화해 JOB을 기준으로 정렬(최대, 최소, 평균값)을 계산해 출력한다.
이후 가장 마지막에 총계(최대, 최소, 평균값)를 출력한다.
--1.
SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL)
FROM EMP
GROUP BY DEPTNO, JOB;
--1.OUTPUT
DEPTNO JOB COUNT(*) MAX(SAL) SUM(SAL) AVG(SAL)
---------- --------- ---------- ---------- ---------- ----------
20 CLERK 2 1100 1900 950
30 SALESMAN 4 1600 5600 1400
20 MANAGER 1 2975 2975 2975
30 CLERK 1 950 950 950
10 PRESIDENT 1 5000 5000 5000
30 MANAGER 1 2850 2850 2850
10 CLERK 1 1300 1300 1300
10 MANAGER 1 2450 2450 2450
20 ANALYST 2 3000 6000 3000
--2.
SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL)
FROM EMP
GROUP BY DEPTNO, ROLLUP(JOB);
--2.OUTPUT
DEPTNO JOB COUNT(*) MAX(SAL) SUM(SAL) AVG(SAL) DEPTNO
---------- --------- ---------- ---------- ---------- ----------
10 CLERK 1 1300 1300 1300
10 MANAGER 1 2450 2450 2450
10 PRESIDENT 1 5000 5000 5000
10 3 5000 8750 2916.66667 --10
20 CLERK 2 1100 1900 950
20 ANALYST 2 3000 6000 3000
20 MANAGER 1 2975 2975 2975
20 5 3000 10875 2175 --20
30 CLERK 1 950 950 950
30 MANAGER 1 2850 2850 2850
30 SALESMAN 4 1600 5600 1400
30 6 2850 9400 1566.66667 --30
--3.
SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL)
FROM EMP
GROUP BY JOB, ROLLUP(DEPTNO);
--3.OUTPUT
DEPTNO JOB COUNT(*) MAX(SAL) SUM(SAL) AVG(SAL) GROUP
---------- --------- ---------- ---------- ---------- ----------
10 CLERK 1 1300 1300 1300
20 CLERK 2 1100 1900 950
30 CLERK 1 950 950 950
CLERK 4 1300 4150 1037.5--CLERK
20 ANALYST 2 3000 6000 3000
ANALYST 2 3000 6000 3000--ANALYST
10 MANAGER 1 2450 2450 2450
20 MANAGER 1 2975 2975 2975
30 MANAGER 1 2850 2850 2850
MANAGER 3 2975 8275 2758.33333--MANAGER
30 SALESMAN 4 1600 5600 1400
SALESMAN 4 1600 5600 1400--SALESMAN
10 PRESIDENT 1 5000 5000 5000
PRESIDENT 1 5000 5000 5000--PRESIDENT
--4.
SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB);
--4.OUTPUT
DEPTNO JOB COUNT(*) MAX(SAL) SUM(SAL) AVG(SAL)
---------- --------- ---------- ---------- ---------- ----------
10 CLERK 1 1300 1300 1300
10 MANAGER 1 2450 2450 2450
10 PRESIDENT 1 5000 5000 5000
10 3 5000 8750 2916.66667--10
20 CLERK 2 1100 1900 950
20 ANALYST 2 3000 6000 3000
20 MANAGER 1 2975 2975 2975
20 5 3000 10875 2175--20
30 CLERK 1 950 950 950
30 MANAGER 1 2850 2850 2850
30 SALESMAN 4 1600 5600 1400
30 6 2850 9400 1566.66667--30
14 5000 29025 2073.21429--TOTAL
집합으로 묶을 수 있다.
SELECT DEPTNO, JOB, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB)
UNION
SELECT DEPTNO, NULL, COUNT(*), MAX(SAL), SUM(SAL), AVG(SAL)
FROM EMP
GROUP BY CUBE(DEPTNO);
--OUTPUT
DEPTNO JOB COUNT(*) MAX(SAL) SUM(SAL) AVG(SAL)
---------- --------- ---------- ---------- ---------- ----------
10 CLERK 1 1300 1300 1300
10 MANAGER 1 2450 2450 2450
10 PRESIDENT 1 5000 5000 5000
10 3 5000 8750 2916.66667--10
20 ANALYST 2 3000 6000 3000
20 CLERK 2 1100 1900 950
20 MANAGER 1 2975 2975 2975
20 5 3000 10875 2175--20
30 CLERK 1 950 950 950
30 MANAGER 1 2850 2850 2850
30 SALESMAN 4 1600 5600 1400
30 6 2850 9400 1566.66667--30
14 5000 29025 2073.21429--TOTAL
각 열 별로 해당하는 것의 갯수를 그룹화해 출력할 때, 다음과 같이 작성할 수 있다.
이때, 서로의 FIELD 갯수가 맞아야 하므로 각각 부족한 부분에 NULL 값을 추가해야 한다.
SELECT DEPTNO, NULL, COUNT(*)
FROM EMP
GROUP BY DEPTNO
UNION
SELECT NULL, JOB, COUNT(*)
FROM EMP
GROUP BY JOB;
--OUTPUT
DEPTNO NULL COUNT(*)
---------- --------- ----------
10 3
20 5
30 6
ANALYST 2
CLERK 4
MANAGER 3
PRESIDENT 1
SALESMAN 4
코드를 다음과 같이 GROUPING SETS를 이용하면 깔끔하게 짤 수 있다.
SELECT DEPTNO, JOB, COUNT(*)
FROM EMP
GROUP BY GROUPING SETS(DEPTNO, JOB)
ORDER BY DEPTNO, JOB;
--OUTPUT
DEPTNO JOB COUNT(*)
---------- --------- ----------
10 3
20 5
30 6
ANALYST 2
CLERK 4
MANAGER 3
PRESIDENT 1
SALESMAN 4
PIVOT 함수를 통해 내가 원하는 데이터를 기준으로 정렬할 수 있다.
DEPTNO를 기준으로 각각의 JOB의 최고 급여를 출력해
JOB 순서대로 정렬해줌
SELECT *
FROM(SELECT DEPTNO, JOB, SAL
FROM EMP)
PIVOT(MAX(SAL)
FOR DEPTNO IN(10,20,30)
)
ORDER BY JOB;
--OUTPUT
JOB 10 20 30
--------- ---------- ---------- ----------
ANALYST 3000
CLERK 1300 1100 950
MANAGER 2450 2975 2850
PRESIDENT 5000
SALESMAN 1600
JOB을 기준으로 각각 DEPTNO의 최고 급여를 출력해
DEPTNO 순서대로 정렬해줌
'CLERK'이 아니라 CLERK으로 출력되도록 AS를 붙임
SELECT *
FROM(SELECT DEPTNO, JOB, SAL
FROM EMP)
PIVOT(MAX(SAL)
FOR JOB IN (
'CLERK' AS CLERK,
'SALESMAN' AS SALESMAN,
'PRESIDENT' AS PRESIDENT,
'MANAGER' AS MANAGER,
'ANALYST' AS ANALYST)
)
ORDER BY DEPTNO;
--OUTPUT
DEPTNO CLERK SALESMAN PRESIDENT MANAGER ANALYST
---------- ---------- ---------- ---------- ---------- ----------
10 1300 5000 2450
20 1100 2975 3000
30 950 1600 2850
'Oracle' 카테고리의 다른 글
Oracle - join (0) | 2020.06.02 |
---|---|
Oracle EMP Table 예시 (0) | 2020.06.01 |
Oracle 기본 Query문 3 (0) | 2020.05.27 |
Oracle 기본 Query문 2 (0) | 2020.05.27 |
Oracle 기본 설정, query문 기본 (0) | 2020.05.27 |