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

위와 같습니다.

 

+ Recent posts