본문 바로가기
알고리즘

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

by 홍서 2024. 4. 24.

문제

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

 

프로그래머스

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

programmers.co.kr

풀이과정

  1. food_product와 food_order 테이블을 사용한다.
  2. 조건: 생산일자가 2022 5월인 식품 -> food_order테이블에서 알 수 있는 정보
  3. 식품 ID(food_product), 식품 이름(food_order), 총매출을 조회
    1. 총매출을 구하기 위해서는 단순히 food_order테이블을 이용해서 join을 해서는 안된다.
    2. food_order 테이블에서 생산일자가 5월인 식품들을 가져와서,
    3. groupby를 통해 해당 제품끼리 그룹핑을 한 후, 각 그룹의 amount의 합을 구해줘야한다!
    4. 이후에 food_order amount 열과 food_product의 price 열을 곱해서 최종 총매출을 구하면 된다.
  4. 이때 결과는 총매출을 기준으로 내림차순 정렬, 총매출이 같다면 식품 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