식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기
- 평균 음식 주문 금액 기준 : 5,000 / 10,000 / 30,000 / 30,000 초과
- 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상
-- 내가 작성한 쿼리문
SELECT restaurant_name
, CASE WHEN AVG(A_price) <= 5000 THEN 'price_group1'
WHEN AVG(A_price) > 5000 AND AVG(A_price) <= 10000 THEN 'price_group2'
WHEN AVG(A_price) > 10000 AND AVG(A_price) <= 30000 THEN 'price_group3'
WHEN AVG(A_price) > 30000 THEN 'price_group4'
END "평균음식주문금액"
, CASE WHEN AVG(A_age) < 30 THEN 'age_group1'
WHEN AVG(A_age) BETWEEN 30 AND 39 THEN 'age_group2'
WHEN AVG(A_age) BETWEEN 40 AND 49 THEN 'age_group3'
ELSE 'age_group4'
END "평균연령"
FROM
(
SELECT f.restaurant_name
, AVG(f.price) A_price
, AVG(c.age) A_age
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id
GROUP BY 1
) a
GROUP BY 1
ORDER BY restaurant_name
-- 학습자료의 쿼리문
select restaurant_name,
case when price <=5000 then 'price_group1'
when price >5000 and price <=10000 then 'price_group2'
when price >10000 and price <=30000 then 'price_group3'
when price >30000 then 'price_group4' end price_group,
case when age <30 then 'age_group1'
when age between 31 and 39 then 'age_group2'
when age between 40 and 49 then 'age_group3'
else 'age_group4' end age_group
from
(
select a.restaurant_name,
avg(price) price,
avg(age) age
from food_orders a inner join customers b on a.customer_id=b.customer_id
group by 1
) t
order by 1
+
LEFT JOIN 을 사용 할 경우
메인쿼리에 GROUP BY 를 한번 더 해줘야 하는데
INNER JOIN 을 사용 할 경우에는
GROUP BY 를 한번 더 사용하지 않아도 정상적으로 출력한다.
Q. GROUP BY 를 하지 않았을 경우 1개의 행만 추출을 하는데 왜일까?
* LEFT JOIN 과 INNER JOIN 의 차이를 알아보았다.
강의 영상을 따라서 LEFT JOIN 을 할 경우
SELECT f.restaurant_name
, AVG(f.price) A_price
, AVG(c.age) A_age
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id
GROUP BY 1
ORDER BY 3
+
고객테이블의 NULL 값도 같이 추출이 되는데
INNER JOIN 을 할 경우
select a.restaurant_name,
avg(price) price,
avg(age) age
from food_orders a inner join customers b on a.customer_id=b.customer_id
GROUP BY 1
ORDER BY 3
+
주문이력과 고객테이블 모두 값이 있을 때 출력을 한다
+
'wichcraft' 음식점은 price 는 있으나 age 데이터는 입력되어 있지 않은 것으로 보인다
Q. 'wichcraft' 음식점은 어떤 정보를 가지고 있는가?
SELECT restaurant_name , price, age
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id
WHERE restaurant_name = 'wichcraft'
A.
고객테이블의 age 컬럼에는 데이터가 입력되어있지 않다.
Q. 해당 음식점 외에 다른 음식점들은 모두 정보를 가지고 있나?
* 주문이력에는 있고, 고객테이블에는 없는 데이터 값
SELECT f.customer_id , restaurant_name , price, age
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id
WHERE c.customer_id IS NULL
+
23건 있음...
Q. 이 데이터 중에 왜 'wichcraft' 행만 출력이 되었는지?
Q. GROUP BY 를 하지 않았을 경우 1개의 행만 추출을 하는데 왜일까?
아직 위 2가지 질문은 해결되지 않았다.
해결되는데로 수정할 예정!
'개인공부' 카테고리의 다른 글
[python] 빈 리스트 생성 [] 와 list() 의 차이 (0) | 2024.04.04 |
---|---|
SQL 코드카타 (0) | 2024.03.31 |
파이썬 알고리즘 코드카타 (1) | 2024.03.30 |
[python] map() 함수와 join() 함수 사용법 (0) | 2024.03.30 |
[SQL] LEFT JOIN 과 INNER JOIN 차이 2 (1) | 2024.03.22 |