취업준비/코딩테스트 문제 풀이

[프로그래머스 SQL 코딩테스트 연습] Lv4. 5월 식품들의 총매출 조회하기 (MySQL)

상급닌자연습생 2024. 7. 10. 15:15

🤔 문제

다음은 식품의 정보를 담은 `FOOD_PRODUCT` 테이블과 식품의 주문 정보를 담은 `FOOD_ORDER` 테이블입니다. `FOOD_PRODUCT` 테이블은 다음과 같으며 `PRODUCT_ID`, `PRODUCT_NAME`, `PRODUCT_CD`, `CATEGORY`, `PRICE`는 식품 ID, 식품 이름, 식품코드, 식품분류, 식품 가격을 의미합니다.

 

`FOOD_ORDER` 테이블은 다음과 같으며 `ORDER_ID`, `PRODUCT_ID`, `AMOUNT`, `PRODUCE_DATE`, `IN_DATE`, `OUT_DATE`, `FACTORY_ID`, `WAREHOUSE_ID`는 각각 주문 ID, 제품 ID, 주문량, 생산일자, 입고일자, 출고일자, 공장 ID, 창고 ID를 의미합니다.

 

`FOOD_PRODUCT`와 `FOOD_ORDER` 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.

 

 

예시

`FOOD_PRODUCT` 테이블이 다음과 같고

 

`FOOD_ORDER` 테이블이 다음과 같을 때

 

SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

 

 

 

 

 


💻 나의 풀이

WITH A AS(
    SELECT o.PRODUCT_ID, p.PRODUCT_NAME, p.PRICE, o.AMOUNT
    FROM FOOD_ORDER o
    LEFT JOIN FOOD_PRODUCT p ON o.PRODUCT_ID=p.PRODUCT_ID
    WHERE o.PRODUCE_DATE LIKE '2022-05%'
)
SELECT PRODUCT_ID, PRODUCT_NAME, SUM(PRICE * AMOUNT) AS TOTAL_SALES
FROM A
GROUP BY 1
ORDER BY 3 DESC, 1;

 

 

 

 

 

결과

 

 

 


💡 다른 풀이

1. WITH 구문 없이 간단한 풀이

SELECT P.PRODUCT_ID, PRODUCT_NAME, SUM(PRICE * AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT P
JOIN FOOD_ORDER O ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE PRODUCE_DATE LIKE '2022-05%'
GROUP BY 1
ORDER BY 3 DESC, 1

 

 

 

 

2. 멘토님 풀이

SELECT o.PRODUCT_ID,
		MAX(p.PRODUCT_NAME) AS PRODUCT_NAME,
        SUM(o.AMOUNT * p.PRICE) AS TOTAL_SALES
FROM FOOD_ORDER o
JOIN FOOD_PRODUCT p ON o.PRODUCT_ID = p.PRODUCT_ID
WHERE 1 = 1
	AND o.PRODUCE_DATE BETWEEN '2022-05-01' AND '2022-05-31'
GROUP BY 1
ORDER BY 3 DESC, 1;

 

잘 이해가 안가는 부분이 있어서 나의 동반자, '챗 지피티'님께 여쭤봤다.

  • `MAX(p.PRODUCT_NAME) AS PRODUCT_NAME` : `GROUP BY` 를 사용할 때 모든 선택된 열이 집계 함수로 처리되거나 `GROUP BY` 절에 포함되어야 합니다. 여기서 `MAX(p.PRODUCT_NAME)`은 그룹화된 각 제품 ID별로 제품 이름 중 하나를 선택하는 데 사용됩니다. 모든 행이 같은 제품 ID에 대해 동일한 제품 이름을 가지므로, `MAX` 함수는 단순히 해당 제품 이름을 반환합니다.
  • `1 = 1` : 항상 참인 조건으로, 종종 쿼리에서 조건을 추가하거나 제거할 때 유용하게 사용됩니다.