Pivot은 회전시킨다는 의미를 가지고 있고, Pivot절은 행을 열로 바꾸어 조회 하는 기능이다.
Pivot은 일반적으로 통계나 보고서에서 주로 사용한다고 알고 있었다.
DB를 공부할 때에는 실무에서 직접 Pivot을 사용할 거라고는 생각해 본 적이 없다.
하지만, 원하는 쿼리를 구현하기 위해 Pivot을 사용함으로써 개발 효율성을 증대시킬 수 있다는 걸 느끼고,
이번에 Pivot을 이용한 쿼리를 실무에서 사용해봤다. (feat. 회사동료(DK 대리님))
참고로 Pivot은 MySQL에서 지원하는 기능이 아니라서 Pivot을 사용한 것과 같은 결과물이 나오도록 쿼리를 작성해야한다.
1. Pivot을 사용하게 된 로직
아래 테이블은 임시로 만든 테이블로 피봇을 사용하게 된 로직을 설명하기 위한 테스트 테이블이다.
PIVOT_TEST 테이블을 보면 NAME, P_KIND, REQ_TIME, RES_TIME 이라는 칼럼이 존재한다.
- NAME 이라는 칼럼의 값이 기준이다. (NOT NULL)
- P_KIND라는 칼럼에의 값은 "A, B, C" 3개의 값만 들어갈 수 있다. (NOT NULL)
- P_KIND의 값별로 가장 최근의 REQ_TIME, RES_TIME 의 값을 구한다. (MAX)
- 결과는 하나의 행으로 나와야 한다. (P_KIND 의 종류에 따라 REQ_TIME(MAX)와 RES_TIME(MAX) 값이 나온다.)
2. Pivot 처럼 사용하기 위한 테이블 만들기
MySQL에서 Pivot 기능을 사용하기 전에 Pivot의 바탕이 되는 테이블이 있어야한다. (원하는 값만 행열로 나오는 테이블)
NAME 이라는 컬럼에는 "상품" 이라는 값 말고도 다른 값들이 존재하며 해당 값들은 중복값을 가지고 있고, 각 값마다 P_KIND 의 종류가 존재한다. NAME의 데이터는 외부에서 받기 때문에 지금은 테스트 테이블에 있는 "상품"이라는 값을 기준으로 작성한다.
위의 테이블 결과를 보면 P_KIND 를 GROUP BY 하여 REQ_TIME과 RES_TIME 의 최대 값을 조회한다.
저렇게 나온 결과를 가지고 P_KIND의 종류에 따라 REQ_TIME(MAX) 와 RES_TIME(MAX) 값이 나오도록 작성하면 된다.
3. Pivot 테이블 대체 쿼리
Pivot 테이블 쿼리를 구현하기 위해 CASE문을 사용한다.
FROM 의 인라인뷰(INLINE VIEW)를 이용하여 아까 작성한 쿼리의 데이터를 활용하여 SELECT를 진행한다.
CASE 문을 이용하여 P_KIND 의 종류마다 MAX_REQ_TIME과 MAX_RES_TIME을 조회하고, 한줄로 표기하기 위해 MAX함수를 이용한다.
이렇게 하면 원했던 Pivot 테이블 결과를 가지고 올 수 있다.