Study
[Oracle/오라클] GROUP BY / HAVING / ROLLUP
_유니
2023. 1. 2. 16:21
SELECT 문 실행 순서
5. SELECT * | 조회하고자 하는 컬럼 별칭 | 산술실 "별칭" | 함수식 AS "별칭"
1. FROM 조회하고자 하는 테이블명
2. WHERE 조건식 (주로 연산자를 가지고 기술)
3. GROUP BY 그룹 기준으로 삼을 컬럼 | 함수식
4. HAVING 조건식 (그룹 함수를 가지고 기술)
6. ORDER BY 컬럼명 | 별칭 | 순번 | [ASC|DESC] [NULLS FIRST | NULLS LAST]
GROUP BY 절
그룹 기준을 제시할 수 있는 구문 ( 해당 그룹 기준별로 여러 그룹을 묶을 수 있음)
여러 개의 값들을 하나의 그룹으로 묶어서 처리할 목적으로 사용됨
// 각 부서별 총 급여합
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
// 각 부서별 사원수
SELECT DEPT_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
// 각 부서별 급여합과 사원수 조회
SELECT JOB_CODE, SUM(SALARY), COUNT(*) AS "(명)"
FROM EMPLOYEE
GROUP BY JOB_CODE
ORDER BY JOB_CODE;
// 각 직급별 총 사원수, 보너스를 받는 사원수, 급여합, 평균급여, 최저급여, 최대급여
SELECT JOB_CODE, COUNT(*) || '명' AS "총 사원수", COUNT(BONUS) || '명' AS "보너스를 받는 사원수",
SUM(SALARY) || '원' AS "총 급여", ROUND(AVG(SALARY)) || '원' AS "평균 급여",
MIN(SALARY) || '원' AS "최저 급여", MAX(SALARY) || '원' AS "최대 급여"
FROM EMPLOYEE
GROUP BY JOB_CODE
ORDER BY 1;
-- 각 부서별 총 사원수, 보너스를 받는 사원수, 급여합, 평균급여, 최저급여, 최대급여
SELECT DEPT_CODE, COUNT(*) || '명' AS "총 사원수", COUNT(BONUS) || '명' AS "보너스를 받는 사원수",
SUM(SALARY) || '원' AS "총 급여", ROUND(AVG(SALARY)) || '원' AS "평균 급여",
MIN(SALARY) || '원' AS "최저 급여", MAX(SALARY) || '원' AS "최대 급여"
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY 1;
* GROUP BY 절에 함수실 기술 가능
SELECT DECODE(SUBSTR(EMP_NO, 8, 1), '1', '남', '2', '여') AS "성별", COUNT(*)
FROM EMPLOYEE
GROUP BY SUBSTR(EMP_NO, 8, 1);
* GROUP BY 절에 여러 컬럼 기술 가능
SELECT DEPT_CODE, JOB_CODE, COUNT(*), SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE
ORDER BY DEPT_CODE;
HAVING 절
그룹에 대한 조건을 제시할 때 사용되는 구문 (주로 그룹 함수식을 가지고 조건 제시)
-- 부서별 평균 급여가 300만원 이상인 부서만 조회
SELECT DEPT_CODE, ROUND(AVG(SALARY)) AS "평균급여"
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING AVG(SALARY) >= 3000000
ORDER BY DEPT_CODE;
-- 직급별 급여 합이 1000만원 이상인 직급의 총 급여합 조회
SELECT JOB_CODE, SUM(SALARY) AS "총 급여합"
FROM EMPLOYEE
GROUP BY JOB_CODE
HAVING SUM(SALARY) >= 10000000;
-- 부서별 보너스를 받는 사원이 없는 부서 조회
SELECT DEPT_CODE
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING COUNT(BONUS) = 0;
ROLLUP
그룹별 산출된 결과 값에 중간 집계를 계산해주는 함수
* GROUP BY 절에 기술
-- 각 직급별 급여합과 전체 총 급여합 조회
SELECT JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY ROLLUP(JOB_CODE)
ORDER BY JOB_CODE;