내일배움캠프/SQL

[SQL]피벗테이블 만들기

dydatablog 2024. 11. 18. 17:12
728x90

Pivot tavle (피벗테이블)이란: 2개 이상의 기준을 가지고 있는 데이터를 보다 쉽게 배열하여 보여주는 형식 

 

 

[실습1] 음식점별 시간별 주문건수 Pivot Table 뷰 만들기 (15~20시 사이, 20시 주문건수 기준 내림차순)

select restaurant_name,
       max(if(hh='15', cnt_order, 0)) "15",
       max(if(hh='16', cnt_order, 0)) "16",
       max(if(hh='17', cnt_order, 0)) "17",
       max(if(hh='18', cnt_order, 0)) "18",
       max(if(hh='19', cnt_order, 0)) "19",
       max(if(hh='20', cnt_order, 0)) "20"
from 
(
select a.restaurant_name,
       substring(b.time, 1, 2) hh,
       count(1) cnt_order
from food_orders a inner join payments b on a.order_id=b.order_id
where substring(b.time, 1, 2) between 15 and 20
group by 1, 2
) a
group by 1
order by 7 desc

*MAX를 이용하는 이유는 if를 통한 해당 값이 NULL일 경우를 제거하는 역할

실습1 실행결과

[실습2] 성별, 연령별 주문건수 Pivot Table 뷰 만들기 (나이는 10~59세 사이, 연령 순으로 내림차순)

SELECT age,
	 MAX( if(gender = 'male',cnt_order,0)) "male", -- 행을 MAX로 지정
	 MAX( if(gender= 'female', cnt_order,0)) "female"
FROM
(
SELECT gender,
	   CASE WHEN age between 10 and 19 then 10
	   		WHEN age between 20 and 29 then 20
	   		WHEN age between 30 and 39 then 30
	   		WHEN age between 40 and 49 then 40
	   		WHEN age between 50 and 59 then 50 end age,
	   	COUNT(1) cnt_order -- 주문건수
FROM food_orders f inner join customers c on f.customer_id = c.customer_id 
WHERE age BETWEEN 10 and 59
GROUP BY 1,2
)a
GROUP BY 1
ORDER BY 1 DESC

실습2 실행결과

 

728x90