개발 강의 정리/SQL

[SQL] GROUP BY 확장 : ROLLUP, CUBE, GROUPING SET, 분석함수

심사기 2021. 5. 20. 17:55

1.ROLLUP

: 하위 총계와 같은 누적 집계를 산출할 수 있다. 

 

>부서마다 집계를 하고 싶을 때 ROLLUP 사용

 

 

SELECT
FROM
GROUP BY ROLLUP(컬럼1, 컬럼2, ...) -- 뒤에 있는 컬럼이 먼저 지워지며 롤업 진행!
                                       >>>>>괄호 안에 들어오는 컬럼의 순서에 따라 결과가 달라진다! 

 

 

2.CUBE

:하나의 SELECT문으로 CROSS TABULATION 값을 산출 할 수 있다. 

SELECT
FROM
GROUP BY CUBE(컬럼1, 컬럼2, ...) --가능한 집계를 전부함.
                                           >>컬럼1,컬럼2 집계
                                           >>컬럼1 집계
                                           >>컬럼2 집계
                                           >>전체 집계

 

3.GROUPING 함수

:ROLLUP,CUBE 연산자와 함께 사용한다. 

-ROLLUP과 CUBE에 소계가 계산된 결과에는 1이 표시가 된다. 

SELECT GROUPING(컬럼1), GROUPING(컬럼2)
FROM 
GROUP BY [ROLLUP | CUBE] (컬럼1, 컬럼2)

 

 

4.GROUPING SETS

 

:GROUP BY의 확장 기능, 내가 사용할 그룹을 만들 수 있음. 

 

SELECT
FROM
GROUP BY GROUPING SETS ((컬럼1,컬럼2,컬럼3),(컬럼3,컬럼6),(컬럼2,컬럼5)) --이런식으로 원하는 그룹 생성.

 

 

5.분석함수

:프로그램의 오버헤드를 줄이고 복잡한 분석작업을 간결하게 수행가능하다. 

SELECT  함수
    OVER(   [PARTITION BY 컬럼 리스트] //계산 대상 그룹을 정한다
               [ORDER BY 컬럼 리스트] //정렬
               [WINDOW 절 (ROWS|RANGE BETWEEN)] //분석함수 계산 대상 범위 지정 (어디를 기준으로 앞 뒤)
             )

FROM

 

-RANK

:값의 그룹에서 순위를 계산

: 동일한 점수의 동일한 순위가 있다면 그 다음순위는 동일한 점수가 있는 수만큼 증가된다. 

 

-DENSE_RANK

:동일한 점수의 동일 순위의 다음 순위는 수와 상관 없이 1 증가된 값을 돌려준다

:순위를 건너 뛰지 않음

 

-ROW_NUMBER

:선발하는 것. 

 

 

<PARTITION BY>

select 컬럼, 컬럼, 컬럼
 ,sum(sal) OVER() AS "전체급여합계" //그룹 바이를 안 써도 집계함수를 사용 가능하다. 
, sum(sal) OVER(PARTITION BY deptno) AS "부서급여합계" from emp; //파티션 바이로 대상 그룹을 지정해준다.

<WINDOWING 절>

,SUM(SAL)OVER(ORDER BY SAL ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) "SUM1" --앞에 1행 뒤에 1행 //ORDER BY절로 먼저 필터링 후에 연산! ORDER BY절 없으면 오류! 
,SUM(SAL) OVER(ORDER BY SAL ROWS UNBOUNDED PRECEDING) "SUM2" --앞에 행 계속 누적

<RATIO_TO_REPORT 함수>

:해당구간에서 차지하는 비율을 리턴하는 함수. 

:>> 범위내 전체 SUM 값에서 비율을 계산함. 

SELECT ename,sal
         , ratio_to_report (sal) over () AS "비율"
         , TRUNC(ratio_to_report (sal) over () * 50000 ) AS "받게 될 급여"
FROM EMP;

 

<LAG / LEAD>

LAG :이전 행의 값을 리턴 //행 기준 위에 있는거

LEAD : 다음 행의 값을 리턴 //행 기준 아래 있는거

EXPR : 대상 컬럼명

OFFSET : 값을 가져올 행의 위치 기본값은 1, 생략가능

DEFAULT : 값이 없을 경우 기본값(지정 안 하면 NULL), 생략가능 

PARTITION BY : 그룹 컬럼명, 생략가능

ORDER BY : 정렬 컬럼명, 필수 (정렬을 한 뒤에 그 결과에서 값을 가져오기 때문!)

 

LAG(EXPR [,OFFSET][,DEFAULT] OVER ( [PARTITION BY]ORDER BY )

LEAD(EXPR [,OFFSET][,DEFAULT] OVER ( [PARTITION BY]ORDER BY )