광고 매크로 없는 청정한 블로그를 위해 노력중입니다. 근데 나만 노력하는 것 같음… ㅡㅡ
반응형

셋 다 그룹바이랑 같이 쓰는건데, 조금 다르다.


GROUP BY

select MONTH_ID, COUNT(MONTH_ID) from AV.SALES_FACT group by MONTH_ID;

그 엑셀에 있는 그룹바이 함수 아시죠? 걔랑 같은거다. 특정 그룹으로 묶어서 보여줄 수 있는 건데, 친구 중에 해빙, 롤업, 큐브, 그리고 그루핑 셋이 있는 것. 해빙은 그룹바이랑 같이 묶어서 어떤 조건으로 필터링할 때 쓰는데... where로 쓰면 안되냐고? select문 실행 순서때문에 원하는 결과가 안 나올 수도 있다. where은 그룹바이로 묶기 '전에' 필터링하는거고, having은 그룹바이로 묶고 '나서' 필터링하는거라고 보면 된다. 예를 들어서 지점별 매출을 볼건데 수도권만 볼거다 하면 where에서 지역=서울, 경기, 인천 이렇게 하고 나서 묶을 수 있고 다 묶고 나서 having으로 지역=서울, 경기, 인천 이렇게 할 수도 있다는 얘기.

 

그러니까 해빙은 그룹바이와 함께 나와서 웨얼처럼 쓰이는 애다, 그렇게 이해하시면 되겠다.

 

ROLLUP, CUBE, GROUPING SETS

그럼 얘네는 뭐 하는 애들인데요? 그룹바이는 걍 묶어주는 애들이기 때문에 그룹바이 쓰고 나서 그래서 합계가 얼마임? 하면 이걸 또 계산해야 된다. 아 귀찮아... 엑셀은 다 해주는데 얘네는 왜이래... 하면서 계산기 두들기지 말고 이걸로 하십쇼.

 

ROLLUP

롤롤롤롤 로올업~ 얘는 그룹별로 합계를 구해주는 애인데, 순서가 매우 중요하다. 왜죠? 얘는 순서대로 말아서 합계를 계산해주니까요. A->B랑 B->A는 롤업 입장에서 다른거다. 전체 노트북 중에서 애플 기기 매출 보는거랑 애플 기기중에서 맥북 매출 보는거랑 다르기때문에 롤업을 할 때는 순서가 중요하다.

 

select DNAME, JOB, COUNT(*), SUM(SAL) from SCOTT.EMP, SCOTT.DEPT where SCOTT.EMP.DEPTNO = SCOTT.DEPT.DEPTNO group by rollup (DNAME, JOB) order by DNAME, JOB;

예제 찾기가 너무 힘듭니다.

 

얘는 정렬을 해서 이렇게 나온거고

 

오더바이가 빠지면 이렇게 된다. 그래서 이게 뭐냐고? 위에 두개 차있는 건 부서명-직종별로 사람 몇명+월급 합계 낸거고, 오른쪽에 널 있는건 부서 총 인원+월급총계고, 맨 밑에 있는 건 전체 직원수랑 전체 월급 총계. 롤업(A,B)하면 A,B, A, 전체 이렇게 내주고 땡이다. 여기서 DNAME이랑 JOB 순서를 바꾸면 어떻게 되냐고요?

 

보이는 순서가 안바껴서 널이 왼쪽으로 쏠렸는데, 일단 맨 아랫줄은 전체 총계다. 그리고 왼쪽에 널 있는건 직종인지 직급인지 아무튼 그걸로 총계 낸 거다. 이런 식으로 그룹바이+롤업이 올 때는 순서가 중요하다.

 

CUBE

그 뭐였지? 가짓수 가능한거 다 곱하는거. 그거 비슷한게 큐브다. 큐브는 CUBE(A, B)하면 A, B랑 A, B 그리고 전체총계를 다 내준다.

 

select DNAME, JOB, COUNT(*), SUM(SAL) from SCOTT.EMP, SCOTT.DEPT where SCOTT.EMP.DEPTNO = SCOTT.DEPT.DEPTNO group by cube (DNAME, JOB);

이거 짤렸네... 잠시만요.

 

위에껀 오더바이를 안 한거고, 이건 오더바이 넣어서 깔끔하게 정렬까지 한 결과. 빈칸은 다 널이다. 왜죠? 몰라요 터미널에서 하면 널 빈칸으로 떠… 아무튼, 롤업에서 순서 바꿔서 계산해야 보여줬던것들이 다 나왔는데 순서대로 부서-직급별 총계, 부서별 총계, 직급별 총계(왼쪽이 빈거), 토탈이다. CUBE는 가능한 모든 조합을 다 구해준다. 이게 사실 두개밖에 안돼서 가짓수가 적어보이는거지, 가짓수 많아지면 아 이래서 사람들이 브루트포스 오래 걸린다고 하는거구나를 체감하실 수 있을 것이다.

 

GROUPING SETS

select DNAME, JOB, COUNT(*), SUM(SAL) from SCOTT.EMP, SCOTT.DEPT where SCOTT.EMP.DEPTNO = SCOTT.DEPT.DEPTNO group by grouping sets (DNAME, JOB);

엥? 얘는 결과만 주는 애인가요? 어... 정확히 말하자면 결과만 주는 게 아니라 원하는 것만 만들어 주는 애다. 그러니까 grouping sets(A, B) 하면 A로 하나, B로 하나 주는거다. 그럼 저기서 롤업에서 봤던거 하려면 어떻게 해야돼요? 아 그 부서-직급별로 합계 구하는거요?

 

select DNAME, JOB, COUNT(*), SUM(SAL) from SCOTT.EMP, SCOTT.DEPT where SCOTT.EMP.DEPTNO = SCOTT.DEPT.DEPTNO group by grouping sets ((DNAME, JOB));

뭐야 어떻게 했어요? GROUPING SETS((DNAME, JOB))으로 괄호 두번썼다. 이거 기출에서도 이런 식으로 괄호갖고 장난치는거 많이 나오는데, 괄호 안에서 한번 더 묶으면 걔네끼리 한 세트라는 얘기다. 그래서 롤업((A,B))하면 A+B랑 전체총계만 구해주고 끝이다.

반응형

'Coding > 코딩잡담' 카테고리의 다른 글

Select문에도 순서가 있다  (0) 2025.11.13
식별자  (0) 2025.11.13
NULL이란 무엇인가  (0) 2025.11.12
속성과 관계  (0) 2025.11.11
반정규화  (0) 2025.11.11