Chapter 5. GROUP BY & HAVING

김승현·2021년 10월 11일
0

GROUP BY


  • 그룹함수(SUM,AVG 등)는 단 한개의 결과값만 산출하기 때문에 그룹함수를 이용하여 여러 개의 결과값을 산출하기 위해서는 그룹함수가 적용될 그룹의 기준GROUP BY 절에 기술하여 사용할 수 있다.

  • SELECT 속성 1, 속성2, ...속성N, 집계함수
    FROM TABLE
    GROUP BY 속성 1, 속성2, ...속성N

  • SELECT 문과, GROUP BY 구절에 들어가는 속성은 동일해야 한다.

  • EX) 부서내 성별 인원수를 구하세요.

SELECT DEPT_CODE AS "부서코드", 
DECODE(SUBSTR(EMP_NO,8,1),'1','남','2','여') AS "성별", 
COUNT(*) AS "인원수" 
FROM EMPLOYEE
GROUP BY DEPT_CODE, DECODE(SUBSTR(EMP_NO,8,1),'1','남','2','여')
ORDER BY 1;



HAVING


  • WHERE 절에서는 집계 함수를 사용할 수 없다. (SUM, AVG 등등)

    • 그룹 함수를 사용한 WHERE 절은 사용 불가
  • GROUP BY 를 사용해서 그룹함수로 값을 구해올 조건을 설정할 때에는 HAVING 절에 기술

  • EX) 직급 코드(JOB_CODE) 별 성별의 평균급여, 인원수 출력

SELECT JOB_CODE AS "직급코드", 
DECODE(SUBSTR(EMP_NO,8,1), '1','남', '2', '여') AS "성별", 
AVG(SALARY) AS "평균급여", 
COUNT(*) AS "인원수"
FROM EMPLOYEE
GROUP BY JOB_CODE, DECODE(SUBSTR(EMP_NO,8,1), '1','남', '2', '여')
HAVING AVG(SALARY)>=2500000
ORDER BY 3 DESC;



ROLLUP과 CUBE


  • ROLLUPCUBE그룹별 집계를 표현하기 위한 용도로 사용

  • ROLLUP : 가장 먼저 지정한 그룹별 합계와 총 집계를 표현

  • CUBE : 그룹으로 지정된 모든 그룹에 대한 합계와 총 집계를 표현

  • SELECT 속성 1, 속성2, ...속성N, 집계함수
    FROM TABLE
    GROUP BY ROLLUP | CUBE (속성 1, 속성2, ...속성N)



GROUPING


  • ROLLUP이나 CUBE에 의한 집계 산출물인자로 전달받은 집합의 산출물이면 0을 반환하고, ROLLUP이나 CUBE로 인한 산출물이면 1을 반환하는 함수

  • EX)

    • 부서내 직급별 급여 합계 정보 출력 및 각 부서별 집계
    • 각 부서별 합계 및 총 합계를 구할 수 있도록 하여라. (ROLLUP)
SELECT 

CASE 
WHEN GROUPING(JOB_CODE )=1 AND GROUPING(NVL(DEPT_CODE, '인턴') )=1  THEN '총합계'
WHEN GROUPING(NVL(DEPT_CODE, '인턴') )=1 THEN '합계'
WHEN GROUPING(NVL(DEPT_CODE, '인턴') )=0 THEN NVL(DEPT_CODE, '인턴')
END AS "구분"
,
CASE 
WHEN GROUPING(JOB_CODE )=1 AND GROUPING(NVL(DEPT_CODE, '인턴') )=1  THEN '총합계'
WHEN GROUPING(JOB_CODE )=1 THEN '합계'
WHEN GROUPING(JOB_CODE )=0 THEN JOB_CODE
END AS "구분"
,
SUM(SALARY) AS "합계급여"

FROM  EMPLOYEE
GROUP BY CUBE(NVL(DEPT_CODE, '인턴'), JOB_CODE)
ORDER BY 1,2;
profile
개발자로 매일 한 걸음

0개의 댓글