https://school.programmers.co.kr/learn/courses/30/lessons/131530#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 문제이다.
1 | A1000011 | 10000 |
2 | A1000045 | 9000 |
3 | C3000002 | 22000 |
4 | C3000006 | 15000 |
5 | C3000010 | 30000 |
6 | K1000023 | 17000 |
만원 단위의 가격대 별로 상품을 나누면
- 가격대가 0원 ~ 1만원 미만인 상품은 PRODUCT_ID 가 2인 상품 1개,
- 가격대가 1만원 이상 ~ 2만원 미만인 상품들은 PRODUCT_ID 가 1, 4, 6인 상품 3개,
- 가격대가 2만원 이상 ~ 3만원 미만인 상품은 PRODUCT_ID 가 3인 상품 1개,
- 가격대가 3만원 이상 ~ 4만원 미만인 상품은 PRODUCT_ID 가 5인 상품 1개
SELECT
CASE WHEN PRICE BETWEEN 0 AND 9999 THEN '0'
WHEN PRICE BETWEEN 10000 AND 19999 THEN 10000
WHEN PRICE BETWEEN 20000 AND 29999 THEN 20000
WHEN PRICE BETWEEN 30000 AND 39999 THEN 30000
WHEN PRICE BETWEEN 40000 AND 49999 THEN 40000
WHEN PRICE BETWEEN 50000 AND 59999 THEN 50000
WHEN PRICE BETWEEN 60000 AND 69999 THEN 60000
WHEN PRICE BETWEEN 70000 AND 79999 THEN 70000
WHEN PRICE BETWEEN 80000 AND 89999 THEN 80000
ELSE PRICE
END AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
처음엔 CASE WHEN을 이용해 일일히 구하였다. 문제의 정답이긴 했지만 만약 PRODUCT의 가격대의 범위가 더 크면 코드는 복잡해질 것이다.결국 실전에서는 쓰지 못하는 코드다.
그래서 효율적인 코드를 방법을 찾아보았다. 그 중 하나가 FLOOR를 이용하는 것이다.
- CEILING(number) 올림 : 입력한 숫자와 가장 가까운 큰 정수
- FLOOR(number) 내림 : 입력한 숫자와 가장 가까운 작은 정수
- ROUND(number,num_digis) 반올림 : 정해진 자릿수에서 반올림
SELECT
FLOOR(PRICE/10000)*10000 as PRICE_GROUP
, COUNT(PRODUCT_ID)
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC
만약 가격(PRICE)이 17000이면 17000/10000=1.7이 될것이고, FLOOR(1.7)은 1이된다. 이를 다시 *10000을 해 만 단위로 바꾸는 것이다. 이런식으로 작성하면 처음에 작성한 것보다 훨씬 효율적이다.
'SQL' 카테고리의 다른 글
서브퀴리 응용(2) (0) | 2023.01.01 |
---|---|
서브쿼리 응용 (0) | 2022.12.30 |
JOIN, GROUP BY를 동시에 사용하는 경우 (0) | 2022.12.29 |
SQL) LEFT JOIN(2) (0) | 2022.12.26 |
SQL) LEFT JOIN(1) (0) | 2022.12.26 |