본문 바로가기

학습/SQL

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

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

 

✔️ 난이도 LEVEL4
✔️ 분류 GROUP BY

 

SQL 문제 풀이

📌 문제 분석

  • 총매출 계산 방법: PRICE * AMOUNT (단가 × 판매량)
  • 날짜 조건: PRODUCE_DATE가 2022년 5월인 데이터만 필터링
  • 결과 정렬 기준:
    1. 총매출(TOTAL_SALES) 내림차순
    2. 총매출이 같을 경우, PRODUCT_ID 오름차순

🛠️ 해결 방법

  1. 두 테이블 조인 (JOIN)
    • FOOD_PRODUCT와 FOOD_ORDER를 PRODUCT_ID 기준으로 내부 조인(JOIN)
  2. 생산일자가 2022년 5월인 데이터만 필터링
    • DATE_FORMAT(PRODUCE_DATE, '%Y-%m') = '2022-05' 활용
  3. 총매출 계산
    • SUM(PRICE * AMOUNT) 를 사용하여 제품별 총매출을 계산
  4. 결과 정렬
    • 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

✍️ 풀이 정리

  1. 두 테이블 조인
    • P.PRODUCT_ID = O.PRODUCT_ID 기준으로 JOIN
  2. 날짜 조건 필터링
    • DATE_FORMAT(PRODUCE_DATE, '%Y-%m') = '2022-05'
    • DATE_FORMAT()을 사용해 연-월(YYYY-MM) 형태로 변환 후 비교
  3. 총매출 계산
    • SUM(PRICE * AMOUNT) AS TOTAL_SALES
    • 단가 × 판매량을 합산하여 총매출 계산
  4. 그룹화 (GROUP BY)
    • GROUP BY를 사용할 때 출력할 열을 고려해 서브쿼리를 사용하지 않도록 구성
    • PRODUCT_ID만 그룹화하면 PRODUCT_NAME이 임의로 출력될 가능성이 있음
    • 동일한 PRODUCT_ID는 항상 같은 PRODUCT_NAME을 가지지만, SQL에서는 GROUP BY에서 그룹화되지 않은 칼럼의 값을 어떻게 가져올지 보장하지 않음 → 그래서 PRODUCT_NAME도 함께 그룹화하는 것이 안전!
    • 서브쿼리 없이 해결하려면 GROUP BY에 두 개 이상의 변수를 넣는 것이 핵심!
  5. 정렬 기준 적용 (ORDER BY)
    • ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID ASC
    • 총매출이 큰 순서로 정렬
    • 같은 총매출 내에서는 PRODUCT_ID 기준 오름차순 정렬

 

  

💡 핵심 포인트

✔️ JOIN을 통해 두 테이블을 결합하고 필요한 값 추출
✔️ DATE_FORMAT()을 활용한 날짜 필터링
✔️ SUM() 집계 함수와 GROUP BY를 활용한 제품별 총매출 계산
✔️ ORDER BY를 활용한 다중 정렬 적용