[프로그래머스 LV.2] 상품 별 오프라인 매출 구하기 — MySQL 정답 & 해설

2025. 12. 8. 15:54·코딩테스트/MYSQL

🔗 1. 문제 URL

https://school.programmers.co.kr/learn/courses/30/lessons/131533

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


 

📝 2. 문제 요구사항 정리

PRODUCT 테이블과 OFFLINE_SALE 테이블을 이용해
상품코드(Product Code) 별 매출액(판매가 × 총 판매량)을 구하는 문제입니다.

  • 상품별 총 판매량 = OFFLINE_SALE 테이블에서 SALES_AMOUNT 합산
  • 매출액 = PRICE × 총 판매량
  • 최종 출력 컬럼
    • PRODUCT_CODE
    • SALES (매출액)
  • 정렬 조건
    1. 매출액 내림차순
    2. 매출액이 같다면 상품코드 오름차순

 


 

💡 3. 핵심 개념

✔ 1) 상품별 총 판매량 집계

OFFLINE_SALE 테이블에서 같은 PRODUCT_ID를 기준으로 SUM(SALES_AMOUNT) 필요

✔ 2) 집계 결과와 PRODUCT 테이블 조인

상품의 판매가(PRICE)와 판매량 합계를 함께 사용해야 하기 때문에
PRODUCT 테이블과 PRODUCT_ID 기준으로 JOIN

✔ 3) 매출액 계산

PRICE * SALES_AMOUNT

✔ 4) 정렬 조건 적용

  • 매출액 기준 DESC
  • 상품코드 기준 ASC

 


 

✅ 4. 정답 SQL 코드

SELECT P.PRODUCT_CODE, P.PRICE * S.SALES_AMOUNT AS SALES
FROM PRODUCT P JOIN (SELECT PRODUCT_ID, SUM(SALES_AMOUNT) AS SALES_AMOUNT
                     FROM OFFLINE_SALE
                     GROUP BY PRODUCT_ID
                    ) AS S
ON P.PRODUCT_ID = S.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE ASC;

-- 상품코드 별 매출액(판매가 * 판매량) 합계를 출력하는 SQL문을 작성
-- 결과는 매출액을 기준으로 내림차순 정렬. 매출액이 같다면 상품코드를 기준으로 오름차순 정렬
-- 서브쿼리를 CTE(Common Table Expression)로 분리

WITH SALES_SUM AS (
    SELECT PRODUCT_ID, SUM(SALES_AMOUNT) AS SALES_AMOUNT
    FROM OFFLINE_SALE
    GROUP BY PRODUCT_ID
)

SELECT P.PRODUCT_CODE,
       P.PRICE * S.SALES_AMOUNT AS SALES
FROM PRODUCT P
JOIN SALES_SUM S ON P.PRODUCT_ID = S.PRODUCT_ID
ORDER BY SALES DESC, P.PRODUCT_CODE ASC;

 

💬 5. 풀이하면서 느낀 점

상품마다 판매량을 합산한 뒤, 그 값을 다시 이용해 매출액을 계산해야 하기 때문에
서브쿼리 또는 CTE가 필수적인 구조라는 점이 포인트였습니다.

특히 PRODUCT 테이블의 PRICE와 OFFLINE_SALE 테이블의 SALES_AMOUNT를
직접 곱할 수 없기 때문에 먼저 판매량을 서브쿼리를 이용해 그룹화해 놓는 것이 핵심이었습니다.

정렬 조건도

  • 매출액 기준으로 먼저 정렬
  • 동일 매출액일 때 상품코드 기준 정렬

이라는 두 단계가 있어 SQL 전체 흐름을 깔끔하게 정리하는 연습이 되었습니다.

 

궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.
도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊

'코딩테스트 > MYSQL' 카테고리의 다른 글

[프로그래머스 LV.3] 대장균들의 자식의 수 구하기 — MySQL 정답 & 해설  (0) 2025.12.08
[프로그래머스 LV.2] 가격대 별 상품 개수 구하기 — MySQL 정답 & 해설  (0) 2025.12.08
[프로그래머스 LV.2] 분기별 분화된 대장균의 개체 수 구하기 — MySQL 정답 & 해설  (0) 2025.12.03
[프로그래머스 LV.2] 재구매가 일어난 상품과 회원 리스트 구하기 — MySQL 정답 & 해설  (0) 2025.12.03
[프로그래머스 LV.2] 성분으로 구분한 아이스크림 총 주문량 — MySQL 정답 & 해설  (0) 2025.12.01
'코딩테스트/MYSQL' 카테고리의 다른 글
  • [프로그래머스 LV.3] 대장균들의 자식의 수 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 가격대 별 상품 개수 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 분기별 분화된 대장균의 개체 수 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 재구매가 일어난 상품과 회원 리스트 구하기 — MySQL 정답 & 해설
작지만 꾸준한 성장으로
작지만 꾸준한 성장으로
contact
  • 작지만 꾸준한 성장으로
    파랑새
    작지만 꾸준한 성장으로
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • IT (3)
      • 코딩테스트 (23)
        • 알고리즘 (12)
        • MYSQL (11)
      • 패션 (0)
      • 독후감 (0)
      • TIL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    데이터 리모델링
    와이드 포맷 롱 포맷
    Pandas melt
    Programmers
    공공데이터 전처리
    Python
    백준
    Pandas groupby agg
    알고리즘
    I/O Bound
    모델 추론
    코테
    mysql
    프로그래머스 lv.0
    CPU Bound
    데이터베이스
    SWEA
    Pandas pivot
    코딩테스트
    파이썬
    sql 코딩테스트
    프로그래머스 lv.2
    python3
    파이썬코테
    프로그래머스 lv.1
    프로그래머스
    자바
    wide format
    데이터 전처리 파이프라인
    long format
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
작지만 꾸준한 성장으로
[프로그래머스 LV.2] 상품 별 오프라인 매출 구하기 — MySQL 정답 & 해설
상단으로

티스토리툴바