미래를 예측하는 데이터분석가

[MYSQL] 프로그래머스 가격대 별 상품 개수 구하기 본문

시스템 & 데이터베이스/SQL

[MYSQL] 프로그래머스 가격대 별 상품 개수 구하기

잘하다연 2024. 12. 19. 20:13

SQL 쿼리

SELECT FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
       COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY FLOOR(PRICE / 10000)
ORDER BY PRICE_GROUP ASC;

풀이 과정

  1. 가격 구간 생성:
    • PRICE를 10,000으로 나눈 후 내림(floor) 처리하여 가격대를 구합니다.
    • FLOOR(PRICE / 10000) * 10000을 통해 구간의 최소 금액을 생성합니다.
  2. 상품 개수 세기:
    • COUNT(*)를 사용하여 각 가격대에 해당하는 상품의 개수를 집계합니다.
  3. 그룹화:
    • GROUP BY FLOOR(PRICE / 10000)을 통해 가격대별로 데이터를 그룹화합니다.
  4. 결과 정렬:
    • ORDER BY PRICE_GROUP ASC로 가격대를 기준으로 오름차순 정렬합니다.

예시 데이터 및 실행 결과

PRODUCT 테이블:

PRODUCT_ID PRODUCT_CODE PRICE
1 A1000011 10000
2 A1000045 9000
3 C3000002 22000
4 C3000006 15000
5 C3000010 30000
6 K1000023 17000

실행 결과:

PRICE_GROUP PRODUCTS
0 1
10000 3
20000 1
30000 1

오답노트

1. 오답: ROUND 사용

초기에는 ROUND(PRICE / 10000) * 10000을 사용했으나, 이는 가격이 15,000처럼 중간 값에 있을 때 잘못된 구간으로 분류될 수 있었습니다.

해결: FLOOR를 사용하여 항상 내림 처리로 올바른 구간을 계산.

2. 오답: 정렬 누락

초기 쿼리에서 ORDER BY를 작성하지 않아 결과가 원하는 순서로 나오지 않았습니다.

해결: ORDER BY PRICE_GROUP ASC 추가.


정리 및 배운 점

  1. 가격 구간 분류는 FLOOR, ROUND, CEIL 등 적절한 함수 선택이 중요함
    • 이 문제에서는 항상 내림 처리를 해야 하므로 FLOOR가 적합
  2. 그룹화 후에는 정렬 순서를 명확히 지정해야 원하는 결과를 얻을 수 있음
  3. SQL 작성 시 출력 컬럼명은 문제 요구사항(PRICE_GROUP, PRODUCTS)에 맞게 설정해야함

CASE WEHN으로 모든 구간을 정의하는 것 보다 FLOOR함수와 단순 연산을 사용해 금액 구간을 나누는 것이 가독성면에서 좋았다. FLOOR함수의 쓰임성을 다시금 깨닫게 된 계기가 되었다.