문제
https://school.programmers.co.kr/learn/courses/30/lessons/131117
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이과정
- food_product와 food_order 테이블을 사용한다.
- 조건: 생산일자가 2022년 5월인 식품 -> food_order테이블에서 알 수 있는 정보
- 식품 ID(food_product), 식품 이름(food_order), 총매출을 조회
- 총매출을 구하기 위해서는 단순히 food_order테이블을 이용해서 join을 해서는 안된다.
- food_order 테이블에서 생산일자가 5월인 식품들을 가져와서,
- groupby를 통해 해당 제품끼리 그룹핑을 한 후, 각 그룹의 amount의 합을 구해줘야한다!
- 이후에 food_order amount 열과 food_product의 price 열을 곱해서 최종 총매출을 구하면 된다.
- 이때 결과는 총매출을 기준으로 내림차순 정렬, 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬
풀이
--내가 처음 푼 풀이
select a.product_id, a.product_name, b.amount * a.price total_sales
from food_product a
join
(select fo.product_id, sum(fo.amount) as amount, fo.produce_date
from food_order fo
where produce_date like '2022-05%'
group by fo.product_id) as b
on a.product_id = b.product_id
group by a.product_id
order by 3 desc, 1;
서브 쿼리를 사용하지 않더라도 간단하게 아래처럼 풀 수 있다.
SELECT P.PRODUCT_ID
, P.PRODUCT_NAME
, SUM(O.AMOUNT) * P.PRICE AS TOTAL_SALES
FROM FOOD_PRODUCT P
LEFT JOIN FOOD_ORDER O
ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE O.PRODUCE_DATE BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
GROUP BY P.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID
조인을 사용하지 않고 풀 수 있었다.
group by를 이용해서 총매출을 구하는 것이 가장 중요한 문제이다.
SELECT O.PRODUCT_ID, P.PRODUCT_NAME,
SUM(O.AMOUNT)*P.PRICE AS TOTAL_SALES
FROM FOOD_ORDER O, FOOD_PRODUCT P
WHERE O.PRODUCT_ID = P.PRODUCT_ID
AND O.PRODUCE_DATE LIKE "2022-05%"
GROUP BY 1
ORDER BY 3 DESC, 1
'알고리즘' 카테고리의 다른 글
[JAVA]자바로 반올림 하기 (0) | 2024.10.21 |
---|---|
[SQL]프로그래머스: 상품을 구매한 회원 비율 구하기 (0) | 2024.04.24 |
[JAVA]백준 15685: 드래곤 커브 (0) | 2024.02.04 |
[SQL]프로그래머스 59405: 상위 n개 레코드 (0) | 2023.12.29 |
[SQL]프로그래머스 131537: 오프라인/온라인 판매 데이터 통합하기 (1) | 2023.12.27 |