반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

Oracle SQL - 함수(GROUP BY, HAVING, ROLLUP, CUBE, SELECT 문 구조 및 실행순서) 본문

Oracle SQL/Oracle SQL

Oracle SQL - 함수(GROUP BY, HAVING, ROLLUP, CUBE, SELECT 문 구조 및 실행순서)

yeonee 여니 2023. 6. 1. 17:22
728x90
반응형
SMALL

안녕하세요.

#yeoneeblog 여니입니다 :)

 

/*
    <GROUP BY 절>
    그룹을 묶어줄 기준을 제시할 수 있는 구문 => 그룹함수와 같이 쓰임.
    해당 제시된 기준별로 그룹을 묶을 수 있음
    여러개의 값들을 하나의 그룹으로 묶어서 처리할 목적으로 사용
    
    [표현법]
    GROUP BY 묶어서 기준이 될 컬럼
*/

-- 각 부서별로 총 급여의 합계
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE; -- 부서별로 그룹을 짓겠다.

-- 각 부서별 사원수
SELECT DEPT_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY DEPT_CODE;

-- 각 부서별 총 급여 합을 부서별 오름차순으로 정렬해서 조회
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE ASC; -- 무조건 ORDER BY 마지막 실행됨 ★

-- 각 부서별 총 급여 합을 급여별로 내림차순 정렬해서 조회 --> 어느부서가 제일 급여를 많이 받나?
SELECT DEPT_CODE, SUM(SALARY) -- 3 (정렬전에 조회하고)
FROM EMPLOYEE -- 1
GROUP BY DEPT_CODE -- 2 (조건검사하고)
ORDER BY 2 DESC; -- 4 (마지막 정렬)

-- 각 직급별 직급코드, 총 급여의 합, 사원수, 보너스를 받는 사원의 수, 평균급여, 최고급여, 최소급여
SELECT JOB_CODE 직급코드, 
       SUM(SALARY) 총급여의합,
       COUNT(*) 사원수,
       COUNT(BONUS) 보너스받는사원수,
       ROUND(AVG(SALARY)) 평균급여,
       MAX(SALARY) 최고급여,
       MIN(SALARY) 최소급여
FROM EMPLOYEE
GROUP BY JOB_CODE
ORDER BY 1;

-- 성별 별 사원의 수
-- 성별 : SUBSTR(EMP_NO,8,1)
SELECT 
    DECODE(SUBSTR(EMP_NO,8,1), 1 , '남' , 2 , '여') "성별",
    COUNT(*) 사원수
FROM EMPLOYEE
GROUP BY SUBSTR(EMP_NO,8,1)
ORDER BY 1 DESC; -- 작성위치 위아래 바뀌면 실행순서 때문에 오류남

-- 각 부서별 평균 급여가 300만원 이상인 부서들만 조회
SELECT DEPT_CODE, ROUND(AVG(SALARY))
FROM EMPLOYEE
WHERE ROUND(AVG(SALARY)) >= 3000000
GROUP BY DEPT_CODE; -- 오류남. 문법상 그룹함수를 WHERE절에 쓸 수 없다.

------------------------------------------------------------------------
/*
    <HAVING 절>
    
    그룹에 대한 조건을 제시하고자할때 사용되는 구문
    (주로 그룹함수를 가지고 조건제시) => GROUP BY절과 함께 쓰인다(뒤에)
*/

SELECT DEPT_CODE, ROUND(AVG(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING ROUND(AVG(SALARY)) >= 3000000;

-- 각 직급별 급여 평균이 300만원 이상인 직급코드, 평균급여, 사원수, 최고급여, 최소급여
SELECT JOB_CODE 직급코드, 
       ROUND(AVG(SALARY)) 평균급여, 
       COUNT(*) 사원수,
       MAX(SALARY) 최고급여,
       MIN(SALARY) 최소급여
FROM EMPLOYEE
GROUP BY JOB_CODE
HAVING ROUND(AVG(SALARY)) >= 3000000;

-- 각 부서별 보너스를 받는 사원이 없는 부서만을 조회
SELECT DEPT_CODE
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING COUNT(BONUS) = 0;

-- 각 부서별 평균급여가 350만원 이하인 부서만을 조회
SELECT DEPT_CODE
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING ROUND(AVG(SALARY)) <= 3500000;
--------------------------------------------------------------------------------
/*
    <ROLLUP, CUBE>
    - 그룹별 산출결과 값의 "집계"를 계산하는 함수
    
    ROLLUP(그룹기준에 해당하는 칼럼, 그룹기준에 해당하는 칼럼)
    인자로 전달받은 그룹중 가장 먼저 지정한 그룹을 기준으로 추가집계 결과를 반환해줌.
    
    CUBE(그룹기준에 해당하는 칼럼, 그룹기준에 해당하는 칼럼) :
    인자로 전달받은 그룹들로 가능한 모든 조합별 집계를 반환해줌
*/

SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
--GROUP BY DEPT_CODE, JOB_CODE
GROUP BY ROLLUP(DEPT_CODE, JOB_CODE)
ORDER BY 1;

-- 모든 조합별 통계
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
--GROUP BY DEPT_CODE, JOB_CODE
GROUP BY CUBE(DEPT_CODE, JOB_CODE)
ORDER BY 1;

/*
    <SELECT 문 구조 및 실행순서>
    5. SELECT 조회하고자하는 컬럼명, *, 리터럴, 산술연산식, 함수식
    1. FROM 조회하고자하는 테이블명/DUAL
    2. WHERE 조건식(그룹함수X)
    3. GROUP BY 그룹기준에 해당하는 컬럼명 / 함수식
    4. HAVING 그룹함수식에 대한 조건식
    6. ORDER BY 컬럼명 / 별칭 / 순번 [ASC/DESC] [NULLS FIRST/NULLS LAST]
*/

728x90
반응형
LIST