Grouping sets
cube 와 rollup 을 사용하기 편리하게 도와주는 것
grouping sets( (그룹핑할 컬럼1), (그룹핑할컬럼2) , () )
select deptno, job, sum(sal)
from emp
group by grouping sets ((deptno), (job),())
order by deptno, job asc;
→ rollup 과 cube 보다 출력되는 결과를 더 쉽고 정확하게 예측 할 수 있습니다.
→ () 의 의미는 전체 집계이다.
→ 그룹핑할 컬럼에 ( ) 괄호로 둘러주어야한다.
문제 246 : 아래의 sql 결과를 rollup 이용하지말고 grouping sets 로 수행하시오
select deptno, sum(sal)
from emp
group by grouping sets ((deptno),());
문제 248 : 아래의 SQL 결과를 Grouping set 로 수행할것 (rollup (x))
select deptno, job, sum(sal)
from emp
group by grouping sets((deptno,job),());
→ deptno와 job 의결과값을 보면 한데 묶여져 있기때문에 (deptno, job) 하고 () 전체 토탈을 구해야한다.
문제 249 : grouping sets 를 이용하여 아래와 같이 출력 하시오
select job, deptno, sum(sal)
from emp
group by grouping sets((job,deptno),(deptno),(job));
문제:
select job,max(sal)최대월급, min(sal) 최소월급, avg(sal) 평균월급, sum(sal)
from emp
group by job;
select sum(decode(deptno, 10, sal,null))"10",
sum(decode(deptno, 20, sal,null))"20",
sum(decode(deptno, 30, sal,null))"30"
from emp;
위의 쿼리문에 select 절에 job을 추가하고 실행하시오
select job,sum(decode(deptno, 10, sal,null))"10",
sum(decode(deptno, 20, sal,null))"20",
sum(decode(deptno, 30, sal,null))"30"
from emp group by job;
--> 오류 : select 절의 job 은 일반컬럼이라 그룹함수와 함께 쓸 수 없다. --> 에러가 안나기위해서는 group by 를 사용해준다.
위의 sql 을 이용하여 아래의 sql 결과를 출력하시오
select job,sum(decode(deptno, 10, sal,null))"10",
sum(decode(deptno, 20, sal,null))"20",
sum(decode(deptno, 30, sal,null))"30"
from emp
group by rollup(job);
—> rollup 을 살짝 둘러주면 밑에 집계결과가 나온다.
select decode(job, null, '토탈값',job) 직업,
sum(decode(deptno, 10, sal,null))"10",
sum(decode(deptno, 20, sal,null))"20",
sum(decode(deptno, 30, sal,null))"30",
sum(sal) 토탈값
from emp
group by rollup(job);
→ select 절의 sum(sal) 은 그냥 직업별 토탈값이므로 sum(sal) 토탈값이라고 하면 나온다~
문제 257 :
- --view 쿼리문 보기
-
select text from user_views where view_name = 'EMP14_ADDRESS';
—> where 절에 반드시 대문자로 작성해 주어야한다 (data 에서 가져오는것이기때문에)
-—> text 문 결과물을 복사 해서 쿼리창에 다시 붙여넣어준다.
—>" 지워주고
create or replace view emp14_address
as
그다음에 decode 문에 telecom 컬럼을 추가해 실행해준다.
문제 258 : emp14_address 를 조회하여 telecom 과 통신사별 인원수를 출력하시오(세로 출력)
select telecom, count(*)
from emp14_address
group by telecom;
문제 259 : 위의 결과를 가로로 출력하시오
select sum(decode(telecom, 'sk', 1, null))as sk,
sum(decode(telecom, 'lg', 1, null))as lg,
sum(decode(telecom, 'kt', 1, null))as kt
from emp14_address;
→ telecom이 sk면 1을 뽑아라?
인원수를 출력하는것 이기때문에 sk 인 사람들을 각각 1로 주고 나머지는 null 로 준다
또는
select sum(decode(telecom, 'sk', 7, null))as sk,
sum(decode(telecom, 'lg', 7, null))as lg,
sum(decode(telecom, 'kt', 10, null))as kt
from emp14_address;
→ 오답인 이유
문제 260 : 위의 sql 가지고 아래와 같이 결과를 출력하시오
select address2, sum(decode(telecom, 'sk', 1, null))as sk,
sum(decode(telecom, 'lg', 1, null))as lg,
sum(decode(telecom, 'kt', 1, null))as kt
from emp14_address
group by address2;
—>
문제 261 : 위의 결과에대한 집계결과가 아래와같이 출력
select nvl(address2, '토탈값') as address2 ,
sum(decode(telecom, 'sk', 1, null))as sk,
sum(decode(telecom, 'lg', 1, null))as lg,
sum(decode(telecom, 'kt', 1, null))as kt,
count(*)as 토탈값
from emp14_address
group by rollup(address2);
또는
select nvl(address2, '토탈값') as address2 ,
sum(decode(telecom, 'sk', 1, null))as sk,
sum(decode(telecom, 'lg', 1, null))as lg,
sum(decode(telecom, 'kt', 1, null))as kt,
count(*) as 토탈값
from emp14_address
group by rollup(address2);
→ sum(1)의 의미?
행마다 1을 주어서 그 것을 sum 하면 전체 인원 토탈값이 address2 별로 그룹핑된 결과가 나오게 된다.
count (*) 와 같은 의미
선생님 설명 : 위의 지역별 인원수를 출력하기 위해서 sum 을 사용해서하려면
select adress2, 1
from emp14_address;
이결과를 보면 각 학생마다 1이 행의 데이터로 출력 됩니다.
그래서 그 1을 지역별로 각각 집계하면 아래의 sql 이 되는 것 입니다.
select address2, sum(1)
from emp14_address
group by address2;
그렇지 않고 어차피 인원수를 구하는거면 count(*) 로 구하면된다.
'Oracle > SQL' 카테고리의 다른 글
SQL Sum + Decode 컬럼을 행으로 바꿔 출력 (0) | 2021.11.22 |
---|---|
SQL 데이터 분석함수 - Row_number 출력결과 넘버링 (0) | 2021.11.22 |
SQL 데이터 분석함수 - 집계결과 출력 Cube (0) | 2021.11.19 |
SQL 데이터 분석함수 - 집계결과 출력 Rollup (0) | 2021.11.19 |
SQL 데이터 분석함수 - 원형 비율출력 Ratio_to_report (0) | 2021.11.19 |