[Oracle] 16.그룹함수


그룹함수



그룹 함수는 하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등 하나의 결과로 나타납니다.

그룹 함수의 종류는 다음과 같습니다.


image



갯수 세기:COUNT 함수



COUNT 함수는 검색된 결과의 행의 수를 세는 함수입니다~ 단, null의 개수는 세지 않습니다.


SELECT
    COUNT(*) AS "전체 사원의 수",
    COUNT(commission_pct) AS "커미션 받는 사원 수"
FROM
    employees;




image



최대,최소 구하기: MAX, MIN 함수




-- 사원 내 최대 급여, 최소 급여 구하기 --

SELECT
    MAX(salary) "최대 급여",
    MIN(salary) "최소 급여" 
FROM
    employees;




image



GROUP BY



특정 컬럼을 기준으로 그룹 함수를 사용해야 할 경우,

어떤 컬럼 값을 기준으로 그룹함수를 적용할지 결정해 주어야하는데 이 때 사용하는 것이 GROUP BY 절입니다!

GROUP BY 절을 사용할 경우 기준 컬럼과 그룹함수만 조회가능합니다.


-- 그룹짓기 : GROUP BY 부서별 최대 급여 --

SELECT
    department_id "부서번호",
    MAX(salary) "최대급여"
FROM
    employees
GROUP BY
    department_id;




image




-- 부서별 부서명, 평균 급여와 부서원 수 구하기 --

SELECT
    department_id "부서번호",
     CASE
            WHEN department_id = 10 THEN 'Administration'
            WHEN department_id = 20 THEN 'Marketing'
            WHEN department_id = 30 THEN 'Purchasing'
            WHEN department_id = 40 THEN 'Human Resources'
            ELSE '미정'
        END "부서명",
    lpad(COUNT(*)|| '명',4,' ') "부서원수",
    TO_CHAR(round(AVG(salary) ),'L999,999,999')|| '원' "평균"
FROM
    employees
GROUP BY
    department_id
ORDER BY
    department_id ASC;




image



부서명을 구할 때 CASE 문을 사용했는데, 정말 불편합니다ㅠㅠ

일일이 부서번호에 따라 부서명을 지정해주어야 합니다.

이 때 나중에 배울 join을 이용하면 CASE 문을 이용안하고도 쉽게 부서명을 가져올 수 있습니다.

HAVING



GROUP BY 를 이용하여 그룹으로 묶었을 때, 그룹함수의 조건은 HAVING을 사용합니다.


--부서별 평균 급여가 4500이상인 부서번호 조회--

SELECT
    department_id,
    round(AVG(salary) )
FROM
    employees
GROUP BY
    department_id
HAVING
    round(AVG(salary) ) >= 4500;




image




-- 2007년 12월 이후 월별 입사자 수를 최근 입사일 순으로 정렬해서 조회--

SELECT
    TO_CHAR(hire_date,'YYYY-MM') "연도-월",
    COUNT(*) "사원 수"
FROM
    employees
GROUP BY
    TO_CHAR(hire_date,'YYYY-MM')
HAVING
    TO_CHAR(hire_date,'YYYY-MM') >= '2007-12'
ORDER BY
    TO_CHAR(hire_date,'YYYY-MM') DESC;




image



LANK 구하기




--입사일 순서 조회--


SELECT employee_id "사번", first_name "이름", hire_date "입사일", RANK() OVER(ORDER BY hire_date) "순위"
FROM
    employees;




image




소계 구하기 - Loll up




-- 소계 구하기

SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY ROLLUP(department_id, job_id);