[SQL] 가격대 별 상품 개수 구하기

Ray·2025년 5월 11일

SQL

목록 보기
22/39

🔎 문제설명

  • 출처: 프로그래머스
  • 사용언어(RDBMS): SQL(MySQL)
  • 문제:

    PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.




✅ 제출답안

# 만원 단위의 가격대 별로 상품 개수를 출력
# 가격대 정보는 각 구간의 최소금액
# 가격대를 기준으로 오름차순 정렬
SELECT IF(PRICE < 10000, 0, CONCAT(SUBSTR(PRICE, 1, 1), '0000')) AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT 
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;



🚀 풀이기록

문제를 푼지 시간이 지나고 다시 보니, 내가 생각해도 저렇게 푼게 내 자신이 신기하다(역시 과거의 나는 타인이었어...) 그 때는 시간제한을 두고 풀었으니 어떻게든 푸는데 초점을 두다보니 그런 거 같다.

  1. PRICE_GROUP: 문제를 풀 당시 물건의 최대가격이 80000원이라는 사실을 확인하고, IF문을 만들 때 만 원 미만의 상품에 대해서는 0으로 처리하고, 만원 이상이 상품에 대해서는 가장 앞자리에 있는 문자를 추출해 0을 4개 붙여주는 방식을 취했다. 여기서 CONCAT과 SUBSTR을 사용했는데, 당시 기록을 보니 두 함수가 기억이 나지 않아 지난 문제들을 참고해서 풀었다.
    다른 분들의 답과 비교해보니 그 분들의 답안이 더 범용적인 것 같아 적어본다. 다음에 다른 문제를 풀 때 참고하면 좋을 거 같다.

    # PRICE를 끝에서 4번째 자리까지 절삭
    SELECT CASE WHEN PRICE < 10000 THEN 0
       		ELSE TRUNCATE (PRICE, -4) END AS PRICE_GROUP
               
    # PRICE를 10000으로 나눈 뒤, FLOOR()을 사용하여 결과값보다 크지 않는 정수 반환 
    SELECT FLOOR(PRICE/10000)*10000 AS PRICE_GROUP
    # 같은 방법: SELECT FLOOR(PRICE*0.0001)*10000 AS PRICE_GROUP

  2. SELECT문에 있는 ALIAS를 GROUP BY문에서도 사용할 수 있다는 사실을 알게되었다. 이에 대해 어떻게 GROUP BY문에서도 SELECT에 있는 ALIAS를 사용할 수 있는지를 GPT에게 물어봤더니 다음과 같이 정리해주었다.

    📌 정리: ALIAS 사용 가능 여부

    ALIAS 사용 가능 여부이유
    WHERE❌ 불가능WHERESELECT보다 먼저 실행되므로, ALIAS를 참조할 수 없음.
    GROUP BY⭕ 일부 DBMS에서는 가능MySQL은 최적화를 통해 ALIAS 사용을 허용. 하지만 표준 SQL은 불가.
    HAVING⭕ 일부 DBMS에서는 가능MySQL에서는 ALIAS를 허용하지만, 표준 SQL에서는 원래 컬럼명을 사용해야 함.
    ORDER BY⭕ 가능ORDER BYSELECT 이후에 실행되므로 ALIAS를 사용할 수 있음.

결론: ORDER BY에서는 100% 가능, GROUP BYHAVING은 MySQL에서는 가능하지만 표준 SQL에서는 불가능할 수도 있음.

WHERE에서는 절대 사용할 수 없음!

profile
미래의 독자인 나를 위해 글을 씁니다.

0개의 댓글