[Oracle] 16.그룹함수
그룹함수
그룹 함수는 하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등 하나의 결과로 나타납니다.
그룹 함수의 종류는 다음과 같습니다.
갯수 세기:COUNT 함수
COUNT 함수는 검색된 결과의 행의 수를 세는 함수입니다~ 단, null의 개수는 세지 않습니다.
SELECT
COUNT(*) AS "전체 사원의 수",
COUNT(commission_pct) AS "커미션 받는 사원 수"
FROM
employees;
최대,최소 구하기: MAX, MIN 함수
-- 사원 내 최대 급여, 최소 급여 구하기 --
SELECT
MAX(salary) "최대 급여",
MIN(salary) "최소 급여"
FROM
employees;
GROUP BY
특정 컬럼을 기준으로 그룹 함수를 사용해야 할 경우,
어떤 컬럼 값을 기준으로 그룹함수를 적용할지 결정해 주어야하는데 이 때 사용하는 것이 GROUP BY 절입니다!
GROUP BY 절을 사용할 경우 기준 컬럼과 그룹함수만 조회가능합니다.
-- 그룹짓기 : GROUP BY 부서별 최대 급여 --
SELECT
department_id "부서번호",
MAX(salary) "최대급여"
FROM
employees
GROUP BY
department_id;
-- 부서별 부서명, 평균 급여와 부서원 수 구하기 --
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;
부서명을 구할 때 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;
-- 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;
LANK 구하기
--입사일 순서 조회--
SELECT employee_id "사번", first_name "이름", hire_date "입사일", RANK() OVER(ORDER BY hire_date) "순위"
FROM
employees;
소계 구하기 - Loll up
-- 소계 구하기
SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY ROLLUP(department_id, job_id);