DB 이야기

디비 이야기 25. 그룹함수

김푸른초푸른 2020. 3. 16. 23:00

1. 그룹함수

= 검색된 여러 행을 이용해 통계정보를 계산하는 함수

* GROUP BY 뒤에 전부 위치한다! 


2. 그룹함수 종류 

1) ROLLUP

= group by 절과 같이 사용되며 누적과 총계를 구할시 유용하다.


EX) SELECT job, SUM(sal) FROM emp GROUP BY ROLLUP(job); 

-> 결과에 급여합계에 대한 총계가 나옴


2) GROUPING 함수

= ROLLUP & CUBE에 의한 소계가 발생시 유용하게 사용한다.

소계가 계산된 결과, GROUPING(조건식) = 1 

그 외의 결과, GROUPING(조건식) = 0

=> GROUPING 함수와 DECODE, CASE 제어문으로 소계를 나타내는 필드에 원하는 문자열을 지정할 수 있어 보고서 작성시 유용


EX) SELECT CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
       CASE GROUPING(JOB) WHEN 1 THEN 'All Jobs' ELSE JOB END AS JOB,
       COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
  FROM EMP, DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO
 GROUP BY DNAME, ROLLUP(JOB) 


3) CUBE 함수 

=  결합가능한 모든 값에 대해서 다차원 소계 출력 

-> 연산이 많아서 시스템에 부담을 줄 수 있다 

EX) SELECT
    CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments' ELSE DNAME END AS DNAME,
    CASE GROUPING(JOB) WHEN 1 TEHN 'All Jobs' ELSE JOB END AS JOB,
    COUNT(*) "Total Empl",
    SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY CUBE(DNAME,JOB);


4) GROUPING SET 

= 특정항목에 대한 소계를 출력할시 유용하다 / 표시된 인수들에 대한 개별 집계를 구할 수 있다

순서 상관없이 결과가 출력된다 


EX) SELECT DECODE(GROUPING(DNAME), 1, 'All Departments', DANME) AS DNAME,
       DECODE(GROUPING(JOB), 1, 'All Jobs', JOB) AS JOB,
       COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS (DNAME, JOB);