Oralce rollup, cube, grouping sets
오라클의 rollup, cube 함수는 group by와 함께 사용하는 옵션입니다.
rollup : 첫 번째 컬럼의 집계 결과를 추출
cube : 모든 컬럼의 집계 결과를 추출
직책별, 성별 인원수를 추출하겠습니다.
select sajob, gender, count(*) from sawon
group by rollup(sajob, gender);
위처럼 group by에 rollup을 사용하게 되면, 직책별 성별, 직책별, 전체 인원수를 집계해줍니다.
성별 인원수까지 집계하려면 cube를 사용하면 됩니다.
select sajob, gender, count(*) from sawon
group by cube(sajob, gender);
이렇게 cube를 사용하게 되면, 첫 번째 컬럼뿐만 아니라 모든 컬럼의 집계 결과까지 추출하게 됩니다.
grouping 함수 : 결과 행의 null이 rollup이나 cube에 의한 것인지(1), null 연산에 의한 결과인지(0)를 반환하는 함수입니다. rollup, cube와 함께 사용되며, 연산작업이 없습니다.
위에서 작성했던 직책별, 성별 인원수를 추출하는 쿼리에 적용해보겠습니다.
select sajob, gender, count(*), grouping(sajob), grouping(gender) from sawon
group by cube(sajob, gender);
이렇게 grouping 함수를 사용하면 그 컬럼의 널이 rollup, cube에 의한 값인지를 확인할 수 있습니다.
grouping sets : group by와 함께 사용되며, 여러번의 그룹화를 한번에 하기 위한 함수입니다.
부서별 직책별, 직책별 성별 급여합계를 출력하겠습니다.
select deptno, sajob, sasex, sum(sapay) from sawon
group by grouping sets((deptno, sajob), (sajob, sasex));
grouping sets를 사용하여 간단하게 그룹화를 하였습니다.
컬럼추출 그룹화 : 조건명령 + 계산함수(group by 사용 안함)
직책별 급여합계를 출력하겠습니다.
select sum(decode(sajob, '사원', sapay, 0)) "사원",
sum(decode(sajob, '대리', sapay, 0)) "대리",
sum(decode(sajob, '과장', sapay, 0)) "과장",
sum(decode(sajob, '이사', sapay, 0)) "이사"
from sawon;
위처럼 컬럼단위로 그룹화 하는 것을 컬럼추출 그룹화라고 합니다.
성별 인원수를 추출해보겠습니다.
select
count(decode(gender, '남자', 1)) "남자",
count(decode(gender, '여자', 1)) "여자"
from sawon;
현재 count할 목적으로 decode를 사용하고 있기 때문에, decode의 3번째 인자에는 어느 값을 넣어도 상관 없습니다.
이제까지 배운것을 종합적으로 사용해보겠습니다.
성별 직책별로 평균급여를 추출하겠습니다.
select
gender "성별",
avg(decode(sajob, '사원', sapay)) "사원",
avg(decode(sajob, '대리', sapay)) "대리",
avg(decode(sajob, '과장', sapay)) "과장",
avg(decode(sajob, '부장', sapay)) "부장",
avg(decode(sajob, '회장', sapay)) "회장",
avg(sapay) "평균 급여"
from sawon
group by rollup(gender);
-- group by cube(gender);
-- 컬럼 값이 하나이기 때문에 rollup, cube 어느 것을 사용해도 무관
출처
https://codecow.tistory.com/31
'Oracle(DB관련)' 카테고리의 다른 글
Oracle Prodedure synchronized (lock) (0) | 2022.06.03 |
---|---|
table 권한 조회 (0) | 2022.02.11 |
oracle 정규식 REGEXP (0) | 2021.11.10 |
FTP From PL/SQL (0) | 2021.07.14 |
oracle 독립 트랜잭션 pragma autonomous_transaction (0) | 2021.04.13 |