하는 일/데이터엔지니어링

[ 쿼리 ] Advanced SQL for Data Professionals (5) - PIVOT/UNPIVOT

yeznable 2024. 12. 5. 17:48
728x90

이 포스트는 Medium에 올라온 다음 아티클을 참고하여 정리한 글입니다.

 

Advanced SQL for Data Professionals

To start working with data, it is important to learn tools like SQL. Structured Query Language (SQL) is a programming language used for…

medium.com


이번 포스트에서 정리할 Advanced SQL 케이스는 PIVOT / UNPIVOT 이다.

 

이 케이스는 Databricks SQL에서 적용되는 예제로 설명한다.

내가 실습해보고 있는 MySQL에는 PIVOT, UNPIVOT 함수가 없기 때문에 Medium 아티클에 나와있는 쿼리를 실행해도 에러만 발생된다.

PIVOT, UNPIVOT 함수가 없는 엔진은 어떻게 하면 되는지 쿼리가 적혀있긴 한데 현실적으로 사용될만한 예제는 아닌듯 하다.

 

이전에 이 블로그에 포스팅 했던 MySQL 동적 쿼리를 활용해서 PIVOT, UNPIVOT 했던 예제가 있는데 그 내용을 첨부하도록 하겠다. 


[ UNPIVOT ]

WITH data (productID, I2024, II2024, III2024, IV2024) 
AS 
(
	select 1,100,123,234,4323
	UNION ALL
	select 2,123,445,33,2212
	UNION ALL
	select 3,1222,1223,1232,43232
	UNION ALL
	select 4,111,223,234,213
	UNION ALL
	select 5,22332,2323,2334,4342
)

SELECT * 
FROM data 
UNPIVOT INCLUDE NULLS
(
	sales FOR quarter IN (I2024, II2024, III2024, IV2024)
);

UNPIVOT 전의 데이터
UNPIVOT 결과

 

쿼리를 실행시키면 위의 두 이미지 중 위쪽의 데이터가 아래쪽의 데이터처럼 조회된다고 한다.

앞서 언급했듯이 MySQL에서는 해당 쿼리가 실행되지 않는다.

MySQL에서는 UNPIVOT 시키고 싶은 필드마다 UNION ALL을 통해 구현하라고 쿼리를 써뒀는데 이는 너무 비합리적인 방법 같다.

 

아래에 링크로 가면 동적 쿼리로 UNPIVOT을 구현한 예시를 볼 수 있다.

 

[ MySQL 쿼리 기초 ] 다이나믹 쿼리

다이나믹 쿼리 예시를 나중에 찾아보기 쉽게 남겨둔다.해당 쿼리는 그냥 실행시키는 건 아니고 SP 안에서 활용해야 한다. declare v_fdate varchar(10);declare v_tdate varchar(10);declare v_finished integer default 0;d

yeznable-blog.tistory.com


[ PIVOT ]

WITH data (year, quarter, region, value) as (
	VALUES (2018, 1, 'east', 100),
	(2018, 2, 'east',  20),
	(2018, 3, 'east',  40),
	(2018, 4, 'east',  40),
	(2019, 1, 'east', 120),
	(2019, 2, 'east', 110),
	(2019, 3, 'east',  80),
	(2019, 4, 'east',  60),
	(2018, 1, 'west', 105),
	(2018, 2, 'west',  25),
	(2018, 3, 'west',  45),
	(2018, 4, 'west',  45),
	(2019, 1, 'west', 125),
	(2019, 2, 'west', 115),
	(2019, 3, 'west',  85),
	(2019, 4, 'west',  65)
)
       
SELECT year, region, q1, q2, q3, q4
FROM data
PIVOT (sum(value) AS sales
FOR quarter
IN (1 AS q1, 2 AS q2, 3 AS q3, 4 AS q4))

PIVOT의 경우도 마찬가지다.

Databricks에서는 위의 쿼리로 된다고 하는데 다른 엔진에서 하는 내용은 조금 마음에 안든다.

 

다음 링크를 참고하면 좋을 것 같다.

 

[ MySQL ] 동적 쿼리로 피벗 구현

동적 쿼리(다이나믹 쿼리)가 다양하게 쓰이는 편이고 그 케이스들중 하나를 정리해둔다. 다이나믹 쿼리 관련해서는 이전에 대충 쿼리만 써뒀던 글이 있다. [ MySQL 쿼리 기초 ] 다이나믹 쿼리다

yeznable-blog.tistory.com


이번 케이스는 Databricks에서 사용되는 기능 위주로 소개되어서 내가 뭘 배우기엔 좀 애매했다.

그래도 이미 동적 쿼리를 이용해서 할줄 아는 기능이라서 다행이다.

 

다음 포스트에서는 Compare Row-to-Row 내용을 정리한다.

728x90