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;