개발자 항해

데이터를 그룹화 본문

DB/Oracle

데이터를 그룹화

리치Y 2022. 9. 15. 15:40

 

1. Group화 

 

 

 

2. Group by 절

 

 

3. HAVING 절

 

 

SELECT           [column,] group_function(column)...

FROM              table [WHERE condition]

[GROUP BY    group_by_expression]

[HAVING         having_expression]

[ORDER BY   column];

 

 

 

 

4. GROUP BY에 ROLLUP 나 CUBE  사용

 

 

1) rollup 

 

기본 그룹화와 소계값을 구해주는 연산자

-rollup(N개 컬럼) => N+1개의 그룹화한 결과가 반환됨

 

rollup(dept_id)

=> (dept_id),(전체)

=> rollup  (컬럼 1개) : N+1 = 1 + 1 =2번의 그룹화

 

rollup(dept_id, job_id)

=> (dept_id,job_id),(dept_id),(전체)

=> rollup(2개 컬럼) : 2+1 = 3번의 그룹화

 

 

rollup(dept_id, job_id, mgr_id)

=> (dept_id, job_id, mgr_id),(dept_id,job_id),(dept)id),(전체)

=> rollup(3개 컬럼) : 3+1 = 4번의 그룹화

 

[case1] select dept_id, job_id, sum(salary)

            from employees

           group by dept_id,job_id

           union all 

           select dept_id, to_char(null), sum(salary)

           from employees

           group by dept_id

           union all

           select to_number(null),to_char(null), sum(salary)

           from employees;

 

[case2] select dept_id, job_id, sum(salary)

             from employees

             group by rollup(dept_id, job_id);

 

 

 

 

 

 

 

 

 

2) cube

 

기본 그룹화한 결과와 모든 조합에 대한 소계값을 구해주는 연산자

cube(N개 컬럼) => 2의 N승개의 그룹화한 결과가 반환됨.

 

 

cube(dept_id)

=> (dept_id),(전체)

=> cube(1개 컬럼) : 2의 1승 = 2번의 그룹화

=> cube(2개 컬럼) : 2의 2승 = 4번의 그룹화  

 

cube(dept_id,job_id)

=> (dept_id, job_id) , (dept_id),(job_id),(전체)

 

cube(dept_id,job_id,mgr_id)

=>(dept_id,job_id,mgr_id),

(dept_id,job_id),(job_id,mgr_id),(dept_id,mgr_id),

(dept_id),(job_id),(mgr_id),(전체)

=> cube(3개 컬럼) : 2의 3승 = 8번의 그룹화

(ex1) 부서별 급여 합계와 전 사원의 급여 합계를 출력하시오.

 

[case1] select dept_id, sum(salary)

             from employees

             group by dept_id

             union all

             select to_number(null), sum(salary)

             from employees;

 

[case2] select dept_id, sum(salary)

             from employees

             group by rollup dept_id;

 

[case1], [case2] 가 같은 뜻의 구문이다.

하지만 [case1]은 from절이 두개나 작성되어 있어 성능은 [case2]가 더 좋다. ( [case2]는 from절이 1개라서 ..)

 

 

 

 

 

 

5. grouping 

 

rollup 이나 cube로 생성된 null값과 DB에 저장된 null값을 구분할때 사용한다.

0일때는 해당 컬럼 참조안함, 1일때는 해당 컬럼 참조 이다.

 

 

 

 

'DB > Oracle' 카테고리의 다른 글

Grouping sets  (0) 2022.09.22
상호관련 서브쿼리로 update,delete  (0) 2022.09.14
Subquery로 데이터 조작  (0) 2022.09.14
with 절  (0) 2022.09.14
EXISTS 및 NOT EXISTS 연산자 사용  (0) 2022.09.13