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);
반응형
'SQL 문제 풀기 > 2. SQLD 기출 : 2024.3.01~2024.4.25' 카테고리의 다른 글
<SQLD 54> rownum 에 대한 기출문제 (0) | 2024.04.24 |
---|---|
<SQLD 53> 날짜 함수에 대한 기출문제 (0) | 2024.04.23 |
<SQLD 51> 조인에 대한 기출문제 (0) | 2024.04.21 |
<SQLD 50> NTILE 함수에 대한 기출문제 (0) | 2024.04.20 |
<SQLD 49> Order by 에 대한 기출문제 (1) | 2024.04.18 |