✔️ 문제
FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.
✔️ 난이도 LEVEL4
✔️ 분류 GROUP BY
SQL 문제 풀이
📌 문제 분석
- 총매출 계산 방법: PRICE * AMOUNT (단가 × 판매량)
- 날짜 조건: PRODUCE_DATE가 2022년 5월인 데이터만 필터링
- 결과 정렬 기준:
- 총매출(TOTAL_SALES) 내림차순
- 총매출이 같을 경우, PRODUCT_ID 오름차순
🛠️ 해결 방법
- 두 테이블 조인 (JOIN)
- FOOD_PRODUCT와 FOOD_ORDER를 PRODUCT_ID 기준으로 내부 조인(JOIN)
- 생산일자가 2022년 5월인 데이터만 필터링
- DATE_FORMAT(PRODUCE_DATE, '%Y-%m') = '2022-05' 활용
- 총매출 계산
- SUM(PRICE * AMOUNT) 를 사용하여 제품별 총매출을 계산
- 결과 정렬
- ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID ASC
SELECT P.PRODUCT_ID,P.PRODUCT_NAME, SUM(PRICE*AMOUNT) TOTAL_SALES
FROM FOOD_PRODUCT P JOIN FOOD_ORDER O
ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE DATE_FORMAT(PRODUCE_DATE, '%Y-%m') = '2022-05'
GROUP BY P.PRODUCT_ID,P.PRODUCT_NAME
ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID
✍️ 풀이 정리
- 두 테이블 조인
- P.PRODUCT_ID = O.PRODUCT_ID 기준으로 JOIN
- 날짜 조건 필터링
- DATE_FORMAT(PRODUCE_DATE, '%Y-%m') = '2022-05'
- DATE_FORMAT()을 사용해 연-월(YYYY-MM) 형태로 변환 후 비교
- 총매출 계산
- SUM(PRICE * AMOUNT) AS TOTAL_SALES
- 단가 × 판매량을 합산하여 총매출 계산
- 그룹화 (GROUP BY)
- GROUP BY를 사용할 때 출력할 열을 고려해 서브쿼리를 사용하지 않도록 구성
- PRODUCT_ID만 그룹화하면 PRODUCT_NAME이 임의로 출력될 가능성이 있음
- 동일한 PRODUCT_ID는 항상 같은 PRODUCT_NAME을 가지지만, SQL에서는 GROUP BY에서 그룹화되지 않은 칼럼의 값을 어떻게 가져올지 보장하지 않음 → 그래서 PRODUCT_NAME도 함께 그룹화하는 것이 안전!
- 서브쿼리 없이 해결하려면 GROUP BY에 두 개 이상의 변수를 넣는 것이 핵심!
- 정렬 기준 적용 (ORDER BY)
- ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID ASC
- 총매출이 큰 순서로 정렬
- 같은 총매출 내에서는 PRODUCT_ID 기준 오름차순 정렬
💡 핵심 포인트
✔️ JOIN을 통해 두 테이블을 결합하고 필요한 값 추출
✔️ DATE_FORMAT()을 활용한 날짜 필터링
✔️ SUM() 집계 함수와 GROUP BY를 활용한 제품별 총매출 계산
✔️ ORDER BY를 활용한 다중 정렬 적용
'학습 > SQL' 카테고리의 다른 글
[프로그래머스]SQL학습 - 취소되지 않은 진료 예약 조회하기 (1) | 2025.02.25 |
---|---|
[프로그래머스]SQL학습-보호소에서 중성화한 동물 (1) | 2025.02.24 |
[프로그래머스] SQL학습 - 식품 분류 별 가장 비싼 식품의 정보 조회하기 (0) | 2025.02.24 |
[프로그래머스]SQL학습 - 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2025.02.21 |
[프로그래머스]SQL학습 - 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2025.02.20 |