반응형


안녕하세요!


오늘은 SQL 분석함수에 대해 다뤄보도록 하겠습니다!



분석함수란,


기본 함수로는 구현하기 어려운 데이터의 분석을 쉽게 도와주는 함수입니다.



출처: https://www.mbs.ac.uk



1. RANK 함수


: data 의 순위를 출력하는 함수입니다.


순위 기준 값이 같은 행은 순위도 동일하게 결정됩니다.


순위가 동일한 행의 수를 동일한 순위에 추가하여 다음 순위를 계산하기 때문에 순위가 연속된 수가 아닐 수도 있습니다.


예를 들어, 두 행의 순위가 1로 결정되면 다음 순위는 3입니다.


구문


RANK ( ) OVER

 (

 [ PARTITION BY expr_list ]

 [ ORDER BY order_list ]

 ) 



( ) 


함수에 인수가 없지만 빈 괄호가 필요합니다.


OVER


이후 절에 대하여 rank를 확장한다는 의미가 있습니다.


PARTITION BY expr_list


(선택) PARTITION 즉, 분할을 한다는 의미의 조건절 입니다.

RANK의 조건을 정의하는 하나 이상의 표현식입니다.


ORDER BY order_list 


(선택) 순위 값의 기준이 되는 열을 정의합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다. 즉, ORDER BY가 생략되면 모든 행의 반환 값은 1입니다.


(ORDER BY에서 고유한 순서를 지정하지 않으면 행의 순서는 비확정적입니다.)



반환유형


INTEGER (즉, RANK에 해당하는 숫자)


구 문 출 처: AWS  



활용하기


아래와 같은 COLUMN을 갖고 있는 EMP라는 테이블이 있다고 가정합시다.


EMPNO

ENAME

JOB

SAL

DEPTNO

 

참고: 테이블 스키마를 확인하고 싶을 때

--> SQL>  desc 테이블명;



이 테이블에 대해 아래의 쿼리를 실행해 봅니다.


  SQL> SELECT * FROM EMP;



<결과>


EMPNO

ENAME

JOB

SAL

DEPTNO

 1

 A

 SALESMAN

 1250

 10

 2

 B

 SALESMAN

 1600

 10

 3

 C

 MANAGER

 3000

 20

 4

 D

 CLERK

 1100

 20

 5

 E

 ANALYST

 3000

 30

 6

 F

 ANALYST

 3000

 30

 7

 G

 CLERK

 1300

 30

 8

 H

 MANAGER

 2450

 10

 9

 I

 SALESMAN

 1500

 10



문제1. 이름, 연봉, 순위를 출력하는데

순위는 연봉이 높은 순서로 출력되게 하시오.




추가)


DENSE_RANK 함수와의 비교:


한가지 측면에서 RANK와 DENSE_RANK가 다릅니다.


DENSE_RANK에서는 2개 이상의 행에서 순위가 동일하면 순위 값의 순서에도 빈자리가 없습니다.


예를 들어 두 행의 순위가 1로 결정되면 다음 순위는 2입니다.


(rank의 경우 두 행의 순위가 1로 결정되면 다음 순위는 3입니다.)





2. PIVOT 함수


: 세로(ROW)로 출력되는 결과를 가로(COLUMN)로 출력하는 함수입니다.



관계형 테이블은 다음과 같이 행과 열로 구성됩니다.


EMPNO

ENAME

JOB

SAL

DEPTNO

 1

 A

 SALESMAN

 1250

 10

 2

 B

 SALESMAN

 1600

 10

 3

 C

 MANAGER

 3000

 20

 4

 D

 CLERK

 1100

 20

 5

 E

 ANALYST

 3000

 30

 6

 F

 ANALYST

 3000

 30

 7

 G

 CLERK

 1300

 30

 8

 H

 MANAGER

 2450

 10

 9

 I

 SALESMAN

 1500

 10



문제2. 우선 부서별로 총 월급의 합을 출력해보겠습니다.


 SQL> SELECT DEPTNO, sum(SAL)

              FROM EMP

              GROUP BY DEPTNO;



<결과>


DEPTNO 

SUM(SAL) 

 10

 1250 +  1600 + 2450 + 1500

 20

 3000 + 1100

 30

 3000 + 3000 + 1300



문제3. 과연 이 테이블을 아래와 같이 만드는 방법이 있을까요?


10 

20 

30 

1250 +  1600

   + 2450 + 1500

3000 + 1100

 3000 + 3000 + 1300





참고)


 PIVOT함수를 이용할 때, FROM절에서 SELECT문을 서브쿼리로 이용하여야합니다.

 또한 SELECT 서브쿼리문에서는 결과를 보기위해 필요한 컬럼만을 선별합니다.



원리 설명



추가)


UNPIVOT:


가로(COLUMN)을 세로(ROW)로 출력하는 함수



아래의 간단한 예시를 통해 이해해보도록 합시다!



[EMP2 테이블]


DEPTNO 

A

B

C

D

E

F

G

H

I

10

1250

1600

 

 

 

 

 

2450

1500

20

 

 

3000

1100

 

 

 

 

 

30

 

 

 

 

3000

3000

1300

 

 



문제4. ENAME, DEPTNO, SAL COLUMN으로 테이블을 출력하세요




결과


DEPTNO 

ENAME

SAL

10

A

1250

10

B

1600

10

H

2450

10

I

1500

20

C

3000

20

D

1100

30

E

3000

30

F

3000

30

G

1300




그렇다면 PIVOT 함수는 왜 필요할까요?


임의의 관계현 테이블에 대한 크로스탭 리포트를 생성할 수 있습니다.


UNPIVOT 연산자를 사용하면 임의의 크로스탭 리포트를 정규 관계형 테이블로 변환하는 것이 가능합니다.


참고) PIVOT은 출력결과를 일반 텍스트 또는 XML 포맷으로 반환합니다.



오늘은 유독 글쓰기가 힘드네요


월요병인가 봅니다..


내일은 보다 날씨도, 뇌도 상쾌한 하루가 되길 기대해봅니다!



이 글이 도움되셨다면 아래 공감 꾹~ 






반응형

+ Recent posts