[mssql] groupping_id 함수와 rollup에 대한 질문 1 1 3,793

by 준일정 mssql mysql oracle sql query [2018.06.21 23:53:56]


캡처ss.PNG (30,147Bytes)

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이 나오는 경우에 무엇인지 잘모르겠습니다. 

 

결론적으로는 총계라는 글자가 찍히는 원인이 잘 이해가 되지 않네요 

by 마농 [2018.06.22 08:20:11]

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)
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입