![]() | ![]() |
|---|
PIVOT은 다음과 같이 특정 축을 중심으로 회전시키는 것을 말함
PIVOT이 왜 필요한가?
| student | subject | score |
|---|---|---|
| A | 수학 | 85 |
| A | 영어 | 90 |
| A | 과학 | 70 |
| B | 수학 | 75 |
| B | 영어 | 95 |
| B | 과학 | 80 |
SELECT student, IF(subject = "수학", score, NULL) AS 수학, # IF조건문: IF(조건기준, TRUE일 때 출력값, FALSE일 때 출력값) IF(subject = "수학", score, NULL) AS 수학, IF(subject = "영어", score, NULL) AS 영어, IF(subject = "과학", score, NULL) AS 과학 FROM table↓
| student | 수학 | 영어 | 과학 |
|---|---|---|---|
| A | 85 | NULL | NULL |
| A | NULL | 90 | NULL |
| A | NULL | NULL | 70 |
| B | 75 | NULL | NULL |
| B | NULL | 95 | NULL |
| B | NULL | NULL | 80 |
SELECT student, MAX(IF(subject = "수학", score, NULL)) AS 수학, MAX(IF(subject = "영어", score, NULL)) AS 영어, MAX(IF(subject = "과학", score, NULL)) AS 과학 FROM table GROUP BY student↓
| student | 수학 | 영어 | 과학 |
|---|---|---|---|
| A | 85 | 90 | 70 |
| B | 75 | 95 | 80 |
PIVOT하면서 SUM, COUNT 같은 연산도 가능
SUM(IF(조건, TRUE값, FALSE값)) COUNT(IF(조건, TRUE값, FALSE값))
PIVOT할 때 모든 값이 같거나, 연산 가능한 값이 1개인 경우 => MAX or ANY_VALUE 사용

위 테이블에서 user_id(유저)별로 amount(주문금액)의 합계를 pivot해주세요. order_date를 행으로, user_id를 열(Column)으로 만들어주세요.
- 기대하는 output:
order_date | user_1 | user_2 | user_3
풀이방법1) 집계한 후 PIVOT
![]() | ![]() |
|---|
풀이방법2) PIVOT하면서 바로 집계
![]() | ![]() |
|---|
- 이 경우, if절 이후 true인 값이 각 1개씩이고 나머지는 모두 0이므로 MAX나 ANY_VALUE로 집계해도 무방함
쿼리 실행은 항상 Row 기준으로 출력된다는 것을 기억!!
order_date(날짜) 별로 유저들의 주문금액의 합계를 piovt해주세요. user_id를 행으로, order_date를 열(Column)으로 만들어야 합니다.
- 기대하는 output:
user_id | 2023-05-01 | 2023-05-02 | 2023-05-03 | 2023-05-04 | 2023-05-05

유저 별(user_id), 날짜 별(order_date)로 주문 횟수를 구해주세요. user_id를 행으로 order_date를 열로 만들어주세요.
- 문제의도:
- IF문 안에 amount 대신 1로 표현
- IF문 안에 TRUE값을 어떤 컬럼이 아니라 1로도 표현할 수 있음


- 기대하는 output :
user_id | user_pseudo_id | event_date | event_name | firebase_screen | food_id | session_id
1) 데이터 탐색

2) 우선 event_params에 UNNEST가 필요해보임

3) 컬럼 key를 PIVOT하여 각 'firebase_screen', 'food_id', 'session_id'를 컬럼으로 만들기


4) 쿼리에 무리가 없음을 확인하면, WITH문으로 정의해서 사용
