우당탕탕 개발일지
[SQL] 프로그래머스 JOIN: 5월 식품들의 총매출 조회하기 (level 4) 본문
💡문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/131117
💡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%"
'SQL' 카테고리의 다른 글
[SQL] 프로그래머스 SUM, MAX, MIN String, Date : 연도별 대장균 크기의 편차 구하기(level 3) (0) | 2024.06.29 |
---|---|
[SQL] 프로그래머스 GROUP BY: 조건에 맞는 사원 정보 조회하기 (level 2) (0) | 2024.06.29 |
[SQL] 프로그래머스 Select : 특정 세대의 대장균 찾기 (level 4) (0) | 2024.06.20 |
[SQL] 프로그래머스 SELECT : 특정 물고기를 잡은 총 수 구하기 (level 2) (0) | 2024.03.26 |
[SQL] 프로그래머스 GROUP BY: 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (level 3) (0) | 2024.03.23 |