본문 바로가기

Oracle/SQL

SQL 데이터 분석함수 - 집계결과 출력 Grouping sets

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(*) 로 구하면된다.