본문 바로가기
데이터베이스/MYSQL

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

by 썬키 2023. 1. 7.
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

링크를 클릭하면 해당 문제로 이동합니다.

 

 

출처 - 프로그래머스

위 문제의 난이도는 2레벨인데 처음에 접했을 때는 4레벨쯤으로 보였다.

시간을 좀 많이 소요한 문제인데 막상 또 풀고나니 그렇게 어려웠던 문제는 아닌거 같다는 생각도 들었다.

 

1. 접근하기

처음에는 CASE WHEN 구문을 이용해서 쿼리를 작성해보았다.

SELECT CASE WHEN PRICE BETWEEN 0 AND 10000 THEN '0'
        WHEN PRICE BETWEEN 10000 AND 20000 THEN '10000'
        WHEN PRICE BETWEEN 20000 AND 30000 THEN '20000'
        WHEN PRICE BETWEEN 30000 AND 40000 THEN '30000'
        END AS PRICE_GROUP
        , COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY 1;

사실, Oracle을 다뤄봤던 경험이 있어서 SELECT 절의 Alias는 GROUP BY절에서 사용하지 못한다는걸 알고 있었는데도

그냥 막무가내로 GROUP BY 절에 Alias를 사용해봤는데 웬걸, 오류 없이 실행되었다.

그래서 검색해보니 MySQL에서만 사용이 가능하다고 했다. (뜻밖의 이득)

 

아무튼, 위와 같이 쿼리를 작성하면 될 줄 알았더니 원하던 결과가 나오지 않아서 곰곰이 생각해보았다.

 

그 결과, 위 쿼리는 유지보수 하기에 그다지 적절하지 않다는 판단을 하게 되었다.

만약 추후에 4만원 이상의 가격을 가진 물품들이 나오면 그때마다 쿼리를 새로 추가해야하므로

굉장히 비효율적인 쿼리라는 생각이 들었다.

 

2. 풀이

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

그래서, 나는 FLOOR()라는 함수를 이용하기로 했다.

FLOOR() : 주어진 값보다 작은 정수 중, 가장 큰 정수(소수점 버림)를 반환하는 함수

FLOOR(5.7) // 5
FLOOR(8.3) // 8

 

문제에서 PRICE_GROUP을

 

10000 ≤ PRICE < 20000 : 10000원대

20000 ≤ PRICE < 30000 : 20000원대

...

 

라고 명시했으므로 사이의 값(15800, 29700, ...)들은 10000으로 나눈 후, FLOOR 한 값에 10000을 곱하면

만원대별로 값이 나올거라고 생각해서 위와 같이 쿼리를 작성하게 되었다.

15800 / 10000 = 1.58
FLOOR(15800/10000) // 1
FLOOR(15800/10000) * 10000 // 10000

결론적으로, 15800원은 만원대의 가격이므로 문제에서 원하는 그룹별을 얻을 수 있게 된다.

 

 

풀고나면 어려운 문제는 아닌데 FLOOR()를 써야겠다고 생각한 시간이 너무 오래 걸려서 문제였던 문제🤣

그래도 뭔가 깨달은게 많은 문제여서 뿌듯하다. 

댓글