데이터베이스/Oracle SQL

오라클 SQL과 PL/SQL ( UNPIVOT / LAG / LEAD 함수)

동띠기 2021. 8. 4. 22:14

UNPIVOT() 함수
UNPIVOT 테이블은 PIVOT와 반대의 개념으로 합쳐있는 것을 풀어서 보여주는 역할을 합니다.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.

 	CREATE TABLE UPIVOT
 	AS SELECT * FROM (SELECT DEPTNO, JOB, EMPNO FROM EMP)
 	PIVOT
 	(
 		COUNT(EMPNO) 
 		FOR JOB IN 				('CLERK' AS "CELRK",
 								 'MANAGER' AS "MANAGER",
 								 'PRESIDENT' AS "PRESIDENT",
 								 'ANALYST' AS "ANALYST",
 								 'SALESMAN' AS "SALESMAN")
 	);
 SELECT * FROM UPIVOT;

 

이제 UNPIVOT로 합쳐진 결과를 풀어보겠습니다.

SELECT * FROM UPIVOT
UNPIVOT (EMPNO FOR JOB IN (CELRK, MANAGER, PRESIDENT, ANALYST, SALESMAN));

 

LAG() 함수
이전 행 값을 가져올 때 사용하는 함수 입니다. ( 차후 활용방법을 살펴보겠습니다. )

문법 
LAG(출력할 컬럼명, OFFSET, 기본출력값)
OVER(Query_partition구문, ORDER BY 정렬할 컬럼)

 

SELECT ENAME, HIREDATE, SAL, LAG(SAL, 1, 0) OVER (ORDER BY HIREDATE) "LAG"
FROM EMP;

SAL의 800 값이 LAG의 두번째 값이다. 이전값

SELECT ENAME, HIREDATE, SAL, LAG(SAL, 3, 2) OVER (ORDER BY HIREDATE) "LAG"
FROM EMP;

LAG 4번째 값을 보면 SAL의 첫번째 값이다.

 

이전의 값이 그대로 옮겨오는 것을 볼 수 있습니다.

 

LEAD() 함수
LEAD() 함수는 LAG()의 반대함수로 이후의 값을 가져오는 함수입니다.
문법이나 사용법은 LAG() 함수와 동일합니다. 다만, OFFSET값이 가장 마지막에 보인다는 것만 다릅니다.

 

SELECT ENAME, HIREDATE, SAL, LEAD(SAL, 2, 1) OVER (ORDER BY HIREDATE) "LEAD"
FROM EMP;

LEAD 11번째 값이 SAL의 13번째 값이다.

UNPIVOT / LAG / LEAD 

728x90