group_id() 를 공부하는 도중 이해가 안되는 부분이 있어 질문드립니다. 0 2 859

by 물통20병 [2017.12.14 11:45:15]


rollup을 공부하는 도중 rollup 사이에 상수를 이용하여  group_id()와 조합하면 같은 항목이지만

다른 집합으로 처리할 수 있다는 것을 배웠습니다.


select job, decode(group_id(), 0, sum(sal), 1, max(sal), 2, min(sal), 3, round(avg(sal),2)) data, group_id()
  from emp
 group by 1, rollup(1, 1, 1, job)
 order by group_id(); 

이것과


select job, decode(group_id(), 0, sum(sal), 1, max(sal), 2, min(sal), 3, round(avg(sal),2)) data, group_id()
  from emp
 group by rollup(1, 1, 1, job)
 order by group_id();

이것의 group_id() 값이 왜 달라지는지 이해가 되지 않습니다.

group by의 첫번째 1의 역할이 어떤역할을 하는지 궁금합니다.

by 마농 [2017.12.14 14:53:45]

GROUP_ID() 는 ROLLUP 에 동일 항목이 2번 이상 사용될 때 의미가 있습니다.
ROLLUP 은 기준항목을 우측부터 하나씩 제거해 나가면서 집계합니다.
위 예시로는 5가지 집계 집합이 나오게 됩니다.
1. 원본1 : GROUP BY 1, ROLLUP(1, 1, 1, job)
 - 집계1 : GROUP BY 1, (1, 1, 1, job)
 - 집계2 : GROUP BY 1, (1, 1, 1)
 - 집계3 : GROUP BY 1, (1, 1)
 - 집계4 : GROUP BY 1, (1)
 - 집계5 : GROUP BY 1, ()
 - rollup 밖에 1 이 있으므로 5개 집합 모두 1이 표시됨
 - 1이 있는 것을 기본으로 깔고 1의 갯수에 따라 구별 됨
2. 원본2 : GROUP BY ROLLUP(1, 1, 1, job)
 - 집계1 : GROUP BY (1, 1, 1, job)
 - 집계2 : GROUP BY (1, 1, 1)
 - 집계3 : GROUP BY (1, 1)
 - 집계4 : GROUP BY (1)
 - 집계5 : GROUP BY ()
 - rollup 밖에 1 이 없으므로 4개 집합에만 1이 표시됨, 집계5 는 1이 없음
 - 1이 있는 것 4개 집합끼리 괄호 안의 1의 갯수에 따라 구별 됨
 - 집계5 는 1이 없으므로 따로 구별할 필요 없음. grouping_id() = 0
상수값이라 헷갈릴수도 있습니다.
컬럼으로 바꾸어 해당 컬럼을 조회절에 추가해서 확인해 보세요.
 

SELECT x
     , job
     , GROUP_ID() gid
     , SUM(sal)
  FROM (SELECT 1 x, job, sal, ROWNUM rn FROM emp)
 GROUP BY x, ROLLUP(x, x, x, job)
;
SELECT x
     , job
     , GROUP_ID() gid
     , SUM(sal)
  FROM (SELECT 1 x, job, sal, ROWNUM rn FROM emp)
 GROUP BY ROLLUP(x, x, x, job)
;
-- rownum 은 쿼리 변환 방지용으로 사용했습니다.
-- rownum 이 없으면 원하는 결과가 안나오네요?

 


by 물통20병 [2017.12.14 16:27:33]

감사합니다 혼자서 끙끙 거렸는데 1은 단순히 다른집합을 구분해 주는 역할을 하는 것이었군요

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