우당탕탕 개발일지

[SQL] 프로그래머스 JOIN: 5월 식품들의 총매출 조회하기 (level 4) 본문

SQL

[SQL] 프로그래머스 JOIN: 5월 식품들의 총매출 조회하기 (level 4)

민아당긴아 2024. 6. 24. 16:50

💡문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/131117

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

💡SQL 코드 설계

1. 필요한 상품ID, 상품명, 매출총액 필드를 SELECT문으로 불러온다

2. JOIN을 통해 두 테이블을 조인하고, 이 때 PRODUCT ID를 기준으로 조인한다

3. 제조연월이 2022-05인 레코드만 고른다

4. PRODUCT_ID로 그룹화하고, 가격*판매량의 총합을 매출총액 필드에 넣는다

5. 매출총액, PRODUCT ID를 기준으로 정렬한다.

 

💡SQL 코드

-- 코드를 입력하세요
select 
    fp.PRODUCT_ID,
    fp.PRODUCT_NAME,
    sum(fp.price * fo.amount) as TOTAL_SALES
from 
    food_product as fp
join
    food_order as fo
on 
    fp.product_id = fo.product_id
where
    year(fo.produce_date) = 2022 and
    month(fo.produce_date) = 05
group by
    fp.product_id
order by 
    sum(fp.price * fo.amount) desc,
    fp.product_id asc

 

💡기억할 내용

1. 당연히 일대일 관계일 것이라고 단정짓지 말자!

처음에 그룹화할 생각을 못했다.
당연히 FOOD_PRODUCT와 FOOD_ORDER는 일대일 관계일 것이라고 생각해서..

하지만 하나의 상품에 대한 주문이 여러 번 있을 수도 있으므로 일대다관계이다.

예를 들어, '맛있는 들기름'에 대한 정보는 하나밖에 없으므로
이에 대응하는 PRODUCT_ID(P0017)은 FOOD_PRODUCT 테이블에 하나밖에 없다.

그러나 '맛있는 들기름'에 대한 주문이 5건 들어왔으면
FOOD_ORDER에서 PRODUCT_ID가 P0017인 레코드는 5개일 것이다.

그래서 GROUP BY FP.PRODUCT_ID로 그룹화를 해줘야 한다!

 

2. DATE 필드에서 특정 정보(연/월/일)만 가져오는 방법

방법1 YEAR(), MONTH(), DATE() 함수를 사용한다 ->내가 쓴 방법

year(fo.produce_date) = 2022 and
month(fo.produce_date) = 05
day(fo.produce_date) = 01

방법2 문자열로 생각하고 와일드 카드를 쓴다 

PRODUCE_DATE LIKE "2022-05%"