그룹함수(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;
WHERE 절에서는 집계 함수를 사용할 수 없다. (SUM, AVG 등등)
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는 그룹별 집계를 표현하기 위한 용도로 사용
ROLLUP : 가장 먼저 지정한 그룹별 합계와 총 집계를 표현
CUBE : 그룹으로 지정된 모든 그룹에 대한 합계와 총 집계를 표현
SELECT 속성 1, 속성2, ...속성N, 집계함수
FROM TABLE
GROUP BY ROLLUP | CUBE (속성 1, 속성2, ...속성N)
ROLLUP이나 CUBE에 의한 집계 산출물이 인자로 전달받은 집합의 산출물이면 0을 반환하고, ROLLUP이나 CUBE로 인한 산출물이면 1을 반환하는 함수
EX)
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;