본문 바로가기
SQL/코딩테스트

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

by Hi_heidi 2024. 1. 30.

문제

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

 

테이블 형태

테이블 / 출력 결과 예시

 

풀이

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

 

해설

SELECT FLOOR(PRICE / 10000)*10000 AS PRICE_GROUP
        , COUNT(*) AS PRODUCTS 
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
  • 1️⃣만원 단위의 가격대를 만들고 2️⃣가격대별 상품 개수를 집계해야 한다.
  • 1️⃣만원 이하는 0, 만원대는 10000, 2만원대는 20000 … 이므로 가격을 10000으로 나눈 값(ex. 12,000 / 10,000 = 1.2)을 FLOOR 로 소수점 이하 버림(ex. 1.2 → 1)하여 몫을 구한 뒤 10000(ex. 1*10,000=10,000)을 곱해 PRICE_GROUP 을 만들었다
  • 2️⃣SELECT문에서 만든 PRICE_GROUP(가격대) 을 GROUP BY 의 기준으로 설정한 뒤 COUNT(*) 로 각 가격대별 제품 개수를 집계해주었다
  • 마지막으로 가격대 기준으로 오름차순 정렬될 수 있게 PRICE_GROUP 으로 정렬해주었다
💡암기(MySQL 공식문서)
- GROUP BY, HAVING, ORDER BY에서 SELECT의 AliaS 사용 가능
You can use the alias in GROUP BY, ORDER BY, or HAVING clauses to refer to the column

- WHERE절에서는 SELECT의 AliaS를 사용 불가, 실제 컬럼명만 사용가능
Standard SQL disallows references to column aliases in a WHERE clause. This restriction is imposed because when the WHERE clause is evaluated, the column value may not yet have been determined.

- 쿼리실행순서: FROM → WHERE → GROUP BY → (HAVING) → SELECT → ORDER BY