DB - GROUP BY

BroJang·2022년 9월 15일
1

DB

목록 보기
8/14

GROUP BY 절

-> 그룹함수는 그룹으로 묶여진 단 한개의 결과값 산출

-> 그룹함수를 이용하여 여러 개의 결과값을 산출하기 위해서는 그룹함수가 적용될 그룹의 기준을 GROUP BY 절에 기술하여 사용 해야한다.


HAVING 절 -> 그룹함수로 값을 구해올 그룹에 대해 조건을 설정할 때는 HAVING 절을 사용

(그룹함수를 사용한 WHERE절은 사용 불가)



ROLLUP, CUBE

-> 그룹별 산출한 결과값의 집계를 계산하는 함수

-> ROLLUP은 가장 먼저 지정한 그룹별 합계와 총 합계를 구함

-> CUBE는 그룹으로 지정된 모든 그룹에 대한 합계와 총 합계를 구함


GROUPING

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

※ GROUP BY에 의해서 산출된 ROW인 경우에는 0을 반환하고 ROLLUP이나 CUBE에 의해서 산출된 ROW인 경우에는 1을 반환



예제 1)
select department_id, count (*), sum(salary)
from employees
group by department_id
order by 1;
-- group by절로 특정 조건으로 세부조건을 출력하는 함수
-- department_id를 오름차순 정렬

결과 1)

예제 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는 사용하면 안된다.

결과 2)

※ 주의

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)



예제 4)
select department_id, job_id, count (*), sum(salary)
from employees
where department_id >50
group by rollup (department_id, job_id);
-- rollup은 동일한 조건이 있을 경우 미리 하나 더 만드는 함수
-- rollup은 각 항목의 소계는 나오지만, 전체 총계는 나오지 않는다. 

결과 4)

예제 5)
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로 적어주면 된다.

결과 7)
profile
끊임없이 배우고 진보하는 백엔드 개발자입니다. 배움에 있어서 최선을 다하자!

0개의 댓글