
📑 1. 문제설명


문제요약
- PRICE 를 만원 단위 구간으로 나누기
- 예 10,000원 이상 ~ 20,000원 미만 → 10,000
- 각 구간 별 상품 개수 계산해서 PRODUCTS 컬럼에 추력
- 구간 값(PRICE_GROUP)은 해당 구간의 최소 금액으로 표시
- 결과는 가격대 오름차순 정렬
❌ 2. 실패한 시도
SELECT
(PRICE / 10000) * 10000 AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;

처음에 FLOOR()을 안했더니 천원 단위로 구간이 나뉘고, 소수점 넷째자리까지 표시되는 문제가 있었다. 이런 현상이 발생하는 이유는 PRICE / 10000을 했을 때 정수 나눗셈이 아니라 실수 나눗셈이 되서 그렇다.
MySQL에서 / 연산자는 피연산자가 INT 여도 실수로 결과를 반환한다. 예를 들어 15000 / 10000 = 1.5 처럼 소수점이 생기고 여기에 * 10000을 하면 15000.0000 같은 소수점 넷째자리까지 나오게 된다. 왜냐하면 MySQL은 내부적으로 DECIMAL(M, 4) 또는 DOUBLE로 계산해서 기본 표시 포맷이 소수점 4자리까지 나오도록 되어 있는 경우가 많다.
✅ 해결방법
FLOOR()이나 CAST()로 아예 정수형으로 변환하면 깔끔하게 만원단위로 나뉜다.
⭐ 3. 정답코드
SELECT
FLOOR(Price/10000) * 10000 AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM product
GROUP BY price_group
ORDER BY price_group;
처음에는 위와 같이 FLOOR() 없이 쿼리를 썼는데, 20000원, 30000원이 중복으로 두 줄씩 생기는 경우가 발생했다.
겉으로 보기에는 PRICE_GROUP이 20000인 값이 하나로 묶일 것 같지만, 실제로는 이렇게 안 될 수 있다.
원인은 부동소수점(실수) 오차 때문이다.
PRICE / 10000은 MySQL에서 정수 나눗셈이 아니라 실수 연산으로 동작한다.
이 때 실수(double/float)는 내부적으로 2진수 기반으로 값을 저장하기 때문에 20000이 딱 맞아 떨어지지 않고
예를 들면.
- 어떤 행 → 20000.0000000
- 다른 행 → 19999.9999999
처럼 아주 미세한 차이가 생긴다.
MySQL에서 GROUP BY는 값이 완전히 동일해야 같은 그룹으로 인식하기 때문에 같은 정수로는20000이라도 이 두 값은 서로 다른 그룹으로 취급된다. 그래서 20000 구간이 2줄로 나뉘어서 나오는 것이다.
이 문제는 FLOOR()로 감싸면 간단히 해결된다.
FLOOR()는 소수점 아래를 잘라내서 정수 형태로 변환한다. (double → int 로 변환)
- 19999.9999999 → 1 (만원 단위)
- 20000.0000000 → 2 (만원 단위)
그리고 여기에 *10000을 하면: - 1 → 10000
- 2 → 20000
이렇게 깔끔한 정수가 되고, GROUP BY 에서도 같은 값으로 인식된다.
FLOOR()이 아니더라도 ROUND()나 CAST()로 명확하게 정수형 변환 후에 GROUP BY하면 해결된다.
'코딩테스트 > SQL테스트' 카테고리의 다른 글
| [프로그래머스] (MySQL) 그룹별 조건에 맞는 식당 목록 출력하기 문제풀이 (5) | 2025.08.17 |
|---|---|
| [프로그래머스] (MySQL) 노선별 평균 역 사이 거리 조회하기 (6) | 2025.08.14 |
| [프로그래머스] (MySQL) 입양 시각 구하기 (1) (3) | 2025.08.11 |
| [프로그래머스] (MySQL) 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (13) | 2025.08.10 |
| [프로그래머스] (MySQL) 조건에 맞는 사원정보 조회하기 (5) | 2025.08.09 |