관리 메뉴

Mini

[SQL] 프로그래머스 상품별 오프라인 매출구하기 // join, group by 본문

SQL 코테

[SQL] 프로그래머스 상품별 오프라인 매출구하기 // join, group by

Mini_96 2025. 2. 22. 12:36

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

[프로그래머스

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

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

 

 

STEP 1: 원본 테이블 데이터

PRODUCT 테이블:
PRODUCT_ID  | PRODUCT_CODE  | PRICE
1           | A1000011      | 15000
2           | A1000045      | 8000
3           | C3000002      | 42000

OFFLINE_SALE 테이블:
OFFLINE_SALE_ID | PRODUCT_ID | SALES_AMOUNT | SALES_DATE
1              | 1          | 2            | 2022-02-21
2              | 1          | 1            | 2022-03-02
3              | 3          | 1            | 2022-05-01
4              | 2          | 1            | 2022-05-24
5              | 1          | 3            | 2022-07-14
6              | 2          | 1            | 2022-09-22

STEP 2: JOIN 결과 (GROUP BY 전)

PRODUCT_CODE | PRODUCT_ID | PRICE  | SALES_AMOUNT | 개별 판매액(PRICE * SALES_AMOUNT)
A1000011    | 1          | 15000  | 2            | 30000
A1000011    | 1          | 15000  | 1            | 15000
A1000011    | 1          | 15000  | 3            | 45000
A1000045    | 2          | 8000   | 1            | 8000
A1000045    | 2          | 8000   | 1            | 8000
C3000002    | 3          | 42000  | 1            | 42000

STEP 3: GROUP BY 적용 후 최종 결과

PRODUCT_CODE | SALES (SUM of PRICE * SALES_AMOUNT)
C3000002    | 126000  (42000 * 3)
A1000011    | 90000   (15000 * 6)
A1000045    | 16000   (8000 * 2)

틀린 쿼리의 문제점:

select product_code, sales_amount * price as sales
from product p
join offline_sale o on p.product_id = o.product_id
order by sales desc, product_code asc;

이 쿼리는 STEP 2의 결과처럼 각각의 판매 기록이 개별 행으로 출력됩니다.

올바른 쿼리:

SELECT p.product_code, 
       SUM(o.sales_amount * p.price) as sales
FROM product p
JOIN offline_sale o ON p.product_id = o.product_id
GROUP BY p.product_code
ORDER BY sales DESC, p.product_code ASC;

이 쿼리는 STEP 3처럼 상품코드별로 총 매출액이 합산되어 출력됩니다.

각 상품별 판매 현황:

  1. C3000002 (42,000원)
    • 총 판매량: 3개
    • 총 매출액: 42,000 * 3 = 126,000원
  2. A1000011 (15,000원)
    • 총 판매량: 6개 (2 + 1 + 3)
    • 총 매출액: 15,000 * 6 = 90,000원
  3. A1000045 (8,000원)
    • 총 판매량: 2개 (1 + 1)
    • 총 매출액: 8,000 * 2 = 16,000원

이렇게 GROUP BY를 사용하면 각 상품코드별로 데이터가 집계되어 원하는 결과를 얻을 수 있습니다.