select case GROUPING_ID(b.dname, a.job) when 0 then b.dname when 1 then '소계' when 3 then '총계' end dname ,a.job ,sum(a.sal) as sal ,count(*) as emp_count from emp a inner join dept b on a.deptno = b.DEPTNO group by rollup(b.dname, a.job)
이렇게 하면 사진의 쿼리처럼 나오는데,
case grouping_id( b.dname, a.job) -- 조건식 에서
3인 경우에 총계인데
해당 조건식 ( case grouping_id( b.dname, a.job) -- 조건식 에서 ) 에서 3이 나오는 경우에 무엇인지 잘모르겠습니다.
결론적으로는 총계라는 글자가 찍히는 원인이 잘 이해가 되지 않네요
rollup 이나 cube 를 사용하면 소계를 구할 수 있습니다.
이 때 소계행과 일반행을 구별할 수 있는 것이
grouping 과 grouping_id 입니다.
1. GROUPING(b.dname) 은 dname 이 그룹핑이 되었는지 아닌지를 판단합니다.
- dname 이 그대로 나오는 경우 0
- dname 이 그룹핑되어 널이 나오는 경우 1
2. GROUPING_ID(b.dname, a.job) 은
- GROUPING(b.dname) 과 GROUPING(a.job) 을 붙인 결과 2진수를 10진수로 바꾼 값입니다.
- 둘다 나오면(일반) 00 ==> 0
- dname 만 나오면(소계) 01 ==> 1
- 둘다 안나오면(총계) 11 ==> 3
3. 다음 쿼리 결과 확인해 보세요.
SELECT b.dname , a.job , COUNT(*) cnt , GROUPING(b.dname) g1 , GROUPING(a.job) g2 , GROUPING_ID(b.dname, a.job) g3 FROM emp a INNER JOIN dept b ON a.deptno = b.DEPTNO GROUP BY ROLLUP(b.dname, a.job) ;