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;
COUNT( ) 공식 문서 설명-- 기본 구조
WINDOW_FUNCTION(argument) OVER(PARTITION BY 그룹 기준 컬럼 ORDER BY 정렬 기준)
RANK( ) OVER( )
SELECT
*
FROM
(
SELECT
RANK() OVER(PARTITION BY cuisine_type ORDER BY cnt_order DESC) ranking
, cuisine_type
, restaurant_name
, cnt_order
FROM(
SELECT
cuisine_type
, restaurant_name
, COUNT(*) cnt_order
FROM
food_orders
GROUP BY 2)a
)b
WHERE ranking <=3;
SUM( ) OVER( )
SELECT
cuisine_type
, restaurant_name
, cnt_orders
-- 카테고리별 주문 수 합계 구하기
, SUM(cnt_orders)
OVER(PARTITION BY cuisine_type) sum_cuisine
-- 카테고리별 누적합 구하기
, SUM(cnt_orders)
OVER(PARTITION BY cuisine_type ORDER BY cnt_orders) cum_quisine
FROM
(
SELECT
cuisine_type
, restaurant_name
, COUNT(*) cnt_orders
FROM
food_orders fo
GROUP BY 1,2
)a
ORDER BY
cuisine_type, cnt_orders;
날짜 데이터의 이해
[실습] 날짜 데이터의 여러 포맷
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월의 주문건수
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;