https://school.programmers.co.kr/learn/courses/30/lessons/131530
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드설명
FLOOR + GROUP BY + COUNT 를 활용합니다.
문제에서 유의해야할점은, FLOOR 함수입니다.
일반적으로 정수형 값인 18230 원이 있다고 가정합니다.
우리는 여기서 18230 / 10000 * 10000 을 통해서 이 가격이 어떤 범위 내에 있는지 알아낼려고 합니다.
하지만, 여기서 문제점은 18230 / 10000 이 1 이 아니라, 1.823 이 나온다는 점입니다.
그렇기에 FLOOR 함수를 통해서 1.823 에서 소숫점 아래를 모두 버려줍니다.
그 이후에 * 10000 을 하여 원래값으로 돌아옵니다.
처음에는 ROUND 함수를 사용했었습니다. 하지만 ROUND함수는 반올림 함수로서, 0.5 라면 1.0 으로 반올림되기에 틀립니다.
SELECT ( ROUND(PRICE / 10000,0) * 10000 ) AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT AS P
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC
또, 처음에는 COUNT(P.*)로 해도 문제가 없을 것 이라 생각했는데, GROUP BY 절을 사용할떄는 SELECT문에 집계함수(SUM, COUNT)외에는 반드시 GROUP BY 절로 집계한 데이터를 기준으로 출력해주어야 합니다.
코드
SELECT FLOOR( (PRICE / 10000) ) * 10000 AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC;
SELECT ( FLOOR(PRICE / 10000) * 10000 ) AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT AS P
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC
ORACLE
SELECT FLOOR((P.PRICE / 10000)) * 10000 AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT P
GROUP BY FLOOR((P.PRICE / 10000)) * 10000
ORDER BY PRICE_GROUP
ORACLE은 MYSQL 과 다르게 SQL의 작동순서에 따른 별칭명 사용여부를 정확하게 지켜줘야 합니다.
SQL문의 실행순서는
1. FROM
2. JOIN
3. WHERE
4. GROUP BY
5. HAVING
6. SELECT
7. ORDER
위와 같습니다.