GROUP BY 절
-> 그룹함수는 그룹으로 묶여진 단 한개의 결과값 산출
-> 그룹함수를 이용하여 여러 개의 결과값을 산출하기 위해서는 그룹함수가 적용될 그룹의 기준을 GROUP BY 절에 기술하여 사용 해야한다.
(그룹함수를 사용한 WHERE절은 사용 불가)
ROLLUP, CUBE
-> 그룹별 산출한 결과값의 집계를 계산하는 함수
-> ROLLUP은 가장 먼저 지정한 그룹별 합계와 총 합계를 구함
-> CUBE는 그룹으로 지정된 모든 그룹에 대한 합계와 총 합계를 구함
GROUPING
-> ROLLUP이나 CUBE에 의한 집계 산출물이 인자로 전달받은 컬럼 집합의 산출물이면 0을 반환
하고, 아니면 1을 반환하는 함수
※ GROUP BY에 의해서 산출된 ROW인 경우에는 0을 반환하고 ROLLUP이나 CUBE에 의해서 산출된 ROW인 경우에는 1을 반환
select department_id, count (*), sum(salary)
from employees
group by department_id
order by 1;
-- group by절로 특정 조건으로 세부조건을 출력하는 함수
-- department_id를 오름차순 정렬
예제 2)
select department_id, job_id, count (*), sum(salary)
from employees
group by department_id, job_id
order by 1,2;
-- 그룹핑 할 조건이 있을 시 추가로 달아주면 된다.
-- 단, select 절에 사용된 그룹 함수 이외의 컬럼이나 표현식은 group by절에 사용 되어야 한다.
select department_id, job_id, count (*), sum(salary)
from employees
group by department_id;
-- group by절에는 컬럼명이 반드시 사용되어야 하고, 컬럼 alias는 사용하면 안된다.
※ 주의
select department_id, count (*), sum(salary)
from employees
where sum(salary)>20000
group by department_id;
-- where절은 그룹 함수가 올 수 없다.
-- 그룹 함수를 조건으로 쓰고 싶으면 having절을 사용해야 한다.
예제 3)
select department_id, count (*), sum(salary)
from employees
having sum(salary)>20000
group by department_id;
-- 그룹 조건이 아닌 일반 조건일 경우에만 where절을 쓸 수 있다.
결과 3)
select department_id, job_id, count (*), sum(salary)
from employees
where department_id >50
group by rollup (department_id, job_id);
-- rollup은 동일한 조건이 있을 경우 미리 하나 더 만드는 함수
-- rollup은 각 항목의 소계는 나오지만, 전체 총계는 나오지 않는다.
select department_id, job_id, count (*), sum(salary)
from employees
where department_id > 50
group by cube (department_id, job_id);
-- cube 함수는 총계의 내용이 따로 추가가 된다.
-- 나머지는 rollup함수와 비슷하다.
결과 5)
예제 6)
select department_id, manager_id, count (*)
from employees
where department_id >100
group by grouping sets (department_id, manager_id);
-- 하나의 테이블에 다양한 집계 함수를 사용해야 할 경우, union보다는 grouping sets 함수를 사용하면 편하다.
결과 6)
예제 7)
select department_id, listagg(first_name,'>>') within group (order by hire_date)"Listagg Result"
from employees
where department_id > 80
group by department_id;
-- within group 사이에 가로로 나열하고 싶은 규칙을 order by로 적어주면 된다.