🤔 문제
다음은 식품의 정보를 담은 `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` : 항상 참인 조건으로, 종종 쿼리에서 조건을 추가하거나 제거할 때 유용하게 사용됩니다.
'취업준비 > 코딩테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스 SQL 코딩테스트 연습] Lv3. 즐겨찾기가 가장 많은 식당 정보 출력 (MySQL) (0) | 2024.07.17 |
---|---|
[프로그래머스 SQL 코딩테스트 연습] Lv5. 상품을 구매한 회원 비율 구하기 (MySQL) (4) | 2024.07.16 |
[프로그래머스 SQL 코딩테스트 연습] Lv3. 대장균들의 자식의 수 구하기 (MySQL) (0) | 2024.07.08 |
[프로그래머스 SQL 코딩테스트 연습] Lv4. 주문량이 많은 아이스크림들 조회하기 (MySQL) (0) | 2024.06.21 |
[프로그래머스 SQL 코딩테스트 연습] Lv3. 업그레이드 할 수 없는 아이템 구하기 (MySQL) (0) | 2024.06.19 |