[Database] 20. PIVOT

백하림's avatar
Feb 28, 2025
[Database] 20. PIVOT
💡

피벗 정리 포인트

  • 피벗이란? → 세로(행) 데이터를 가로(열) 데이터로 변환하는 것
  • 왜 필요할까? → 데이터를 보기 쉽게 정리하고, 분석을 쉽게 하기 위해
  • SQL에서 피벗 방법
      1. CASE WHEN을 이용한 정적 피벗
      1. GROUP_CONCAT()을 이용한 동적 피벗 (MySQL 전용)

1. 달력을 출력해보자

select * from cal;
notion image

2. 샘플링 코드 1 (1주만 출력)

select sum(if(day = '일', num_day, 0))'일', sum(if(day = '월', num_day, 0))'월', sum(if(day = '화', num_day, 0))'화', sum(if(day = '수', num_day, 0))'수', sum(if(day = '목', num_day, 0))'목', sum(if(day = '금', num_day, 0))'금', sum(if(day = '토', num_day, 0))'토' from cal where week = 1;
notion image

3. 샘플링 코드2 (2주 출력)

select sum(if(day = '일', num_day, 0))'일', sum(if(day = '월', num_day, 0))'월', sum(if(day = '화', num_day, 0))'화', sum(if(day = '수', num_day, 0))'수', sum(if(day = '목', num_day, 0))'목', sum(if(day = '금', num_day, 0))'금', sum(if(day = '토', num_day, 0))'토' from cal where week = 1 union all select sum(if(day = '일', num_day, 0))'일', sum(if(day = '월', num_day, 0))'월', sum(if(day = '화', num_day, 0))'화', sum(if(day = '수', num_day, 0))'수', sum(if(day = '목', num_day, 0))'목', sum(if(day = '금', num_day, 0))'금', sum(if(day = '토', num_day, 0))'토' from cal where week = 2;

4. 샘플링 코드를 참고해서, GROUP BY로 묶어준다.

select week, sum(if(day = '일', num_day, 0))'일', sum(if(day = '월', num_day, 0))'월', sum(if(day = '화', num_day, 0))'화', sum(if(day = '수', num_day, 0))'수', sum(if(day = '목', num_day, 0))'목', sum(if(day = '금', num_day, 0))'금', sum(if(day = '토', num_day, 0))'토' from cal group by week;
notion image

5. 결과를 가지고 실제 테이블로 만들기

💡
CREATE TABLE 테이블명 AS
create table cal2 as select day, num_day from cal; select * from cal2;
notion image

6. cal2를 가지고 주 열을 만들어라. (case when then 사용)

select day,num_day, case when num_day <= 7 then "1" when num_day <= 14 then "2" when num_day <= 21 then "3" when num_day <= 28 then "4" else '5' end '주' from cal2;
notion image

7. cal2를 가지고 주 열을 만들어라. (CEIL함수 사용)

SELECT day, num_day, CEIL(num_day / 7) AS '주' FROM cal2;
notion image
Share article

harimmon