mysql 문제풀이/easy

프로그래머스 Lv 4 - 5월 식품들의 총매출 조회하기

gooreumsea 2023. 7. 18. 23:39

 

습득한 점:

이제 Lv 4 문제도 3문제정도 밖에 남지 않아서, 벌써부터 난이도가 쉬워지고 있다.
그동안 5 난이도 부터 역순으로 문제풀어서, 3 난이도 문제 차례인데, 정답률 80%이하 인 것들만 풀어야 할듯 하다.

더불어, 윈도우 함수(LEAD, LAG, RANK, DENSE_RANK, ROW_NUMBER 등등) 혹은 사용자 정의 함수를 활용하는 문제가
프로그래머스에는 없는 듯해서, 3 난이도를 다 풀고나면 리트코드나 해커랭크 문제를 풀어야 할 것 같다.

아니면 Data Camp 라는 곳도 알아봐야겠다. (유료라 들었는데)

 

 

 

문제:

FOOD_PRODUCT와 FOOD_ORDER 테이블에서

생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 쿼리 작성

결과는 총매출을 기준으로 내림차순 정렬,

총매출이 같다면 식품 ID를 기준으로 오름차순 정렬

 

 

 

문제파악:

Product 테이블은 총 데이터 row 갯수가 40줄

Order 테이블은 총 데이터 row 갯구가 30줄 이었다.

 

Product 테이블의 상품 id가 고유값으로 적힌 테이블이라,

Order 테이블이 데이터 row 수가 더 많을 줄 알았는데, 아니었다.

 

따라서 전체 상품 중 일부 상품만 있는 경우 + 그 일부의 상품 중 상품 id값의 중복인 데이터가 있는 경우

이 2가지만 고려해서 문제를 풀면 된다.

 

LEFT 조인이 필요한 상황은 아니다.
INNER 조인 후, 2022년 5월의 데이터만 WHERE 조건에 넣고, 총 매출을 계산하는 "TOTAL_SALES" 컬럼을 새로 추가한다.

 

여기까지 작성 후, 코드를 실행하면 상품id가 중복되는 데이터 row가 존재 할 수 있는 결과값이 나온다.

 

문제에서 원하는 값은 상품 id가 중복되는 데이터들은 총 매출액을 합산해야 한다.

 

예를 들어,

5월 10일에 참치캔 총 매출액이 350,000원이고, 5월 21일에 참치캔 총 매출액이 200,000원 이라면

결과값으로 나와야 하는 5월의 참치캔 총 매출액은 550,000원으로 계산되어야 하는 식이다.

 

고로 GROUP BY로 PRODUCT_ID를 묶어주고, 이에 대한 합산을 위해

PRICE*AMOUNT를 SUM으로 감싸준다.   

 

PRICE*AMOUNT AS TOTAL_SALES 

>>> SUM(PRICE*AMOUNT) AS TOTAL_SALES

 

정렬조건은 문제에 쓰여진 그대로 기재하면 된다.

 

 

 

풀이:

SELECT FP.PRODUCT_ID
     , FP.PRODUCT_NAME
     , SUM(PRICE*AMOUNT) AS TOTAL_SALES
     
FROM FOOD_PRODUCT AS FP
     INNER JOIN FOOD_ORDER AS FO ON FP.PRODUCT_ID = FO.PRODUCT_ID
WHERE PRODUCE_DATE LIKE '2022-05%'

GROUP BY PRODUCT_ID
ORDER BY TOTAL_SALES DESC
       , PRODUCT_ID ASC