[실습] SQL로 Pivot Table 만들기


SELECT 
	restaurant_name
	-- GROUP BY로 묶어주었기 때문에 집계함수 사용
	, MAX(IF(pay_time='15',cnt_orders,0)) '15'
	, MAX(IF(pay_time='16',cnt_orders,0)) '16'
	, MAX(IF(pay_time='17',cnt_orders,0)) '17'
	, MAX(IF(pay_time='18',cnt_orders,0)) '18'
	, MAX(IF(pay_time='19',cnt_orders,0)) '19'
	, MAX(IF(pay_time='20',cnt_orders,0)) '20'
FROM 
	(	-- 베이스 데이터 구성
		SELECT
			f.restaurant_name 
			, HOUR(p.time) pay_time
			, COUNT(1) cnt_orders
		FROM 
			food_orders f 
			LEFT JOIN payments p
			ON f.order_id = p.order_id
		WHERE HOUR(p.time) BETWEEN 15 AND 20
		GROUP BY 
			restaurant_name, pay_time) a
GROUP BY 1
-- alias = 숫자로 작성 → 억음 부호 사용
ORDER BY `20` DESC;
SELECT 
	age "나이"
	, MAX(IF(gender='male',order_cnt,0)) "남성"
	, MAX(IF(gender='female',order_cnt,0)) "여성"
FROM 
	(	-- 베이스 데이터 구성
	SELECT 
			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
			, c.gender 
			, COUNT(1) order_cnt
	FROM 
		food_orders f 
		LEFT 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;

Window 함수 - RANK, SUM


-- 기본 구조
WINDOW_FUNCTION(argument) OVER(PARTITION BY 그룹 기준 컬럼 ORDER BY 정렬 기준)

포맷 함수


  1. 날짜 데이터의 이해

  2. [실습] 날짜 데이터의 여러 포맷

    select date(date) date_type,
           date_format(date(date), '%Y') "년",
           date_format(date(date), '%m') "월",
           date_format(date(date), '%d') "일",
           # 일요일은 0, 월요일은 1
           date_format(date(date), '%w') "요일"
    from payments
    
  3. [실습] 년도별 3월의 주문건수

    SELECT 
    	DATE_FORMAT(date, '%Y-%m') change_date
    	, COUNT(*) cnt_orders
    FROM 
    	food_orders f 
    	INNER JOIN payments p 
    	ON f.order_id = p.order_id 
    WHERE DATE_FORMAT(date, '%Y-%m') LIKE '%03'
    GROUP BY 1
    ORDER BY 1;