본문 바로가기
SQL 문제 풀기/2. SQLD 기출 : 2024.3.01~2024.4.25

<SQLD 52> rollup에 대한 기출문제

by HYEHYE_SON 2024. 4. 22.
728x90

매일 SQLD 기출 문제 풀기 챌린지


 


문제 52.

주어진 테이블에서 아래와 같은 결과를 반환하는 SQL문을 고르시오

 

[SQLD_52]

DNAME YEAR SAL
경영지원부 2010 4900
경영지원부 2011 5000
경영지원부 2012 5100
인사부 2010 4800
인사부 2011 4900
인사부 2012 5000

 

[RESULT]

DNAME YEAR SUM(SAL)
인사부 2010 4800
인사부 2011 4900
인사부 2012 5000
인사부   14700
경영지원부 2010 4900
경영지원부 2011 5000
경영지원부 2012 5100
경영지원부   15000
    297000

 
① 

SELECT DNAME, YEAR, SUM(SAL)
    FROM SQLD_52
    GROUP BY ROLLUP((DNAME, YEAR), NULL);


② 

SELECT DNAME, YEAR, SUM(SAL)
    FROM SQLD_52
    GROUP BY ROLLUP(DNAME, (DNAME, YEAR));


③ 

SELECT DNAME, SUM(SAL)
    FROM SQLD_52
    GROUP BY ROLLUP((DNAME, YEAR));

 

SELECT DNAME, SUM(SAL)
    FROM SQLD_52
    GROUP BY ROLLUP(DNAME, YEAR, (DNAME, YEAR));

해설해보기

 

■ Reporting 함수 3가지 비교



 1. ROLLUP 


group by roullup([컬럼명],[컬럼명])

이 연산자는 지정된 컬럼에 대해 계층적으로 합계를 수행합니다. 
단, 낮은 수준에서 상위 수준으로 데이터를 요약하여 가장 마지막에 총합계가 출력됩니다. 

#문법 공식을 암기
ROLLUP 함수안에 컬럼의 개수 + 1 개 만큼 집계한 결과 그룹이 출력

select deptno, job, sum(sal) 
    from emp
    group by rollup(deptno, job) -> 2 + 1 = 3개의 집계 결과 그룹이 출력

 

#출력되는 결과 집합
1) 부서번호별 직업별 토탈월급(deptno, job)
2) 부서번호별 토탈월급(deptno)
3) 전체 토탈월급 

 


 2. CUBE 

cube 연산자는 전체 토탈을 맨 위에 출력합니다.

select deptno, sum(sal)
    from emp
    group by cube(deptno);

 

  • rollup vs cube 비교
    • rollup : 컬럼의 개수 + 1개가 그룹핑 되어 출력됩니다.
    • cube : 2의 n승(n = 컬럼의 개수) 만큼 그룹핑 되어 출력됩니다. 

 

 3. grouping sets  

 

group by grouping sets(([컬럼명],[컬럼명]),([컬럼명]),());

 

직접 특정 그룹화 조합을 지정할 수 있어서 가장 선호되는 reporting 함수 입니다. 

지정할 때는 괄호를 사용하여 구분합니다.

 

select deptno, job, sum(sal)
	from emp
	group by grouping sets((deptno, job),(deptno),())
	order by deptno, job;

 


문제 직접 실행하기

 

< 1번 >

SELECT DNAME, YEAR, SUM(SAL)
    FROM SQLD_52
    GROUP BY ROLLUP((DNAME, YEAR), NULL);

 

 

< 2번 >

SELECT DNAME, YEAR, SUM(SAL)
    FROM SQLD_52
    GROUP BY ROLLUP(DNAME, (DNAME, YEAR));

→ 정답! 

DNAME별 총 합계와, DNAME, YEAR 별 합계 

그리고 최종합계가 출력되기 때문에 

2번이 정답입니다.

 

 

 

< 3번 >

SELECT DNAME, SUM(SAL)
    FROM SQLD_52
    GROUP BY ROLLUP((DNAME, YEAR));

 

SELECT절에 YEAR가 없기 때문에 YEAR가 출력되지 않습니다.

 

 

< 4번 >

SELECT DNAME, SUM(SAL)
    FROM SQLD_52
    GROUP BY ROLLUP(DNAME, YEAR, (DNAME, YEAR));

 

SELECT 절에 YEAR가 없기 때문에 출력되지 않습니다. 


관련 스크립트

CREATE TABLE SQLD_52 (
    DNAME VARCHAR2(20),
    YEAR NUMBER(4),
    SAL NUMBER(10)
);

INSERT INTO SQLD_52 (DNAME, YEAR, SAL) VALUES ('경영지원부', 2010, 4900);
INSERT INTO SQLD_52 (DNAME, YEAR, SAL) VALUES ('경영지원부', 2011, 5000);
INSERT INTO SQLD_52 (DNAME, YEAR, SAL) VALUES ('경영지원부', 2012, 5100);
INSERT INTO SQLD_52 (DNAME, YEAR, SAL) VALUES ('인사부', 2010, 4800);
INSERT INTO SQLD_52 (DNAME, YEAR, SAL) VALUES ('인사부', 2011, 4900);
INSERT INTO SQLD_52 (DNAME, YEAR, SAL) VALUES ('인사부', 2012, 5000);

 

반응형