본문 바로가기

Oracle

Oracle 기본 Query문 4

위치를 지정해 반올림하는 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