안녕하세요!
오늘은 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 포맷으로 반환합니다.
오늘은 유독 글쓰기가 힘드네요
월요병인가 봅니다..
내일은 보다 날씨도, 뇌도 상쾌한 하루가 되길 기대해봅니다!
이 글이 도움되셨다면 아래 공감 꾹~
'SQL' 카테고리의 다른 글
ORACLE | 3개의 tables를 조인하는 방법! (1) | 2018.04.04 |
---|---|
ORACLE | JOIN을 사용하는 오라클만의 방법! (0) | 2018.04.03 |
ORACLE | 그룹함수, GROUP BY절과 HAVING (0) | 2018.03.30 |
ORACLE | 날짜타입 형변환하기! (2) | 2018.03.29 |
ORACLE | SQL 문자함수(INSTR, REGEXP_REPLACE, TRIM) (0) | 2018.03.28 |