문제
ROLLUP 결과에서 GROUPING 함수를 이용해 합계 행의 표시명을 지정하려고 한다. 다음 중 가장 적절한 CASE 표현식은?
① CASE WHEN GROUPING(DEPTNO) = 1 AND GROUPING(JOB) = 1 THEN '총계' WHEN GROUPING(JOB) = 1 THEN '소계' ELSE JOB END ② CASE WHEN GROUPING(DEPTNO) = 0 AND GROUPING(JOB) = 0 THEN '총계' ELSE NULL END ③ CASE WHEN GROUPING(DEPTNO) = 1 THEN DEPTNO ELSE '소계' END ④ CASE WHEN GROUPING(JOB) = 0 THEN '소계' ELSE JOB END
정답
1번
해설
정답: 1. GROUPING 값이 1이면 해당 컬럼이 집계로 인해 생성된 NULL임을 의미하므로 DEPTNO와 JOB이 모두 1이면 총계, JOB만 1이면 소계로 표시할 수 있다.
오답 풀이
- 1번: 총계와 소계를 구분하는 CASE로 적절하다.
- 2번: GROUPING 값 0은 실제 그룹 컬럼이 존재하는 일반 행을 의미한다.
- 3번: GROUPING 결과와 실제 컬럼 값을 혼동했다.
- 4번: GROUPING(JOB)=0은 JOB이 존재하는 일반 상세 행이다.
보충 개념 GROUPING(컬럼)은 해당 컬럼이 집계에 의해 NULL로 표시된 경우 1, 실제 데이터에 의해 존재하는 경우 0을 반환한다. ROLLUP 결과의 소계와 총계를 구분할 때 유용하다.