- BigQuery 에서2021년 7월 19일, PIVOT 기능이 신규 추가되었다.
- PIVOT 이란 테이블의 열과 행을 변경하는 것을 말한다.
- 해당 PIVOT 기능에 대한 문법과 유의점에 대해 알아보자.
1. Syntax
--PIVOT 연산자
FROM from_item[, ...] pivot_operator
pivot_operator:
PIVOT(
aggregate_function_call [as_alias][, ...]
FOR input_column
IN ( pivot_column [as_alias][, ...] )
) [AS alias]
as_alias:
[AS] alias
2. Example
다음과 같은 테이블이 있다고 해보자.
product | sales | quarter | year |
Kale | 51 | Q1 | 2020 |
Kale | 23 | Q2 | 2020 |
Kale | 45 | Q3 | 2020 |
Kale | 3 | Q4 | 2020 |
Kale | 70 | Q1 | 2021 |
Kale | 85 | Q2 | 2021 |
Apple | 77 | Q1 | 2020 |
Apple | 0 | Q2 | 2020 |
Apple | 1 | Q1 | 2021 |
위 table A 를 아래 table B 와 같이 변경하고 싶다면,
product | year | Q1 | Q2 | Q3 | Q4 |
Apple | 2020 | 77 | 0 | NULL | NULL |
Apple | 2021 | 1 | NULL | NULL | NULL |
Kale | 2020 | 51 | 23 | 45 | 3 |
Kale | 2021 | 70 | 85 | NULL | NULL |
다음과 같이 쿼리를 작성하면 된다.
SELECT * FROM
table_A
PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))
3. 유의사항
PIVOT 하고자 하는 테이블에서 내가 참조하지 않는 속성이 있는 경우,
명확하게 PIVOT 앞의 FROM 절에서 명시를 해주어야 한다.
그렇지 않을 경우, PIVOT 결과 값이 왜곡된다.
(행 중복)
3.1. Bad Case
단순히 쿼터 별로 합계를 보고 싶다고 할 때(연도와 상관 없이),
아래와 같이 쿼리를 작성하지 말자.
SELECT product, Q1, Q2, Q3, Q4 FROM
table_A
PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))
이에 대한 Result 는 다음과 같다.
product | Q1 | Q2 | Q3 | Q4 |
Kale | 51 | 23 | 45 | 3 |
Kale | 70 | 85 | NULL | NULL |
Apple | 77 | 0 | NULL | NULL |
Apple | 1 | NULL | NULL | NULL |
3.2. Good Case
참조하고자 하는 속성 중 year 가 없는 경우, 다음과 같이 명시해주어야 한다.
SELECT product, Q1, Q2, Q3, Q4 FROM
(SELECT product, quarter, sales FROM table_A)
PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))
이에 대한 Result 는 다음과 같다.
product | Q1 | Q2 | Q3 | Q4 |
Kale | 121 | 108 | 45 | 3 |
Apple | 78 | 0 | NULL | NULL |