SQL/문제풀이

[프로그래머스] 가격대별 상품 개수 구하기

응엉잉 2023. 12. 26. 22:46

https://school.programmers.co.kr/learn/courses/30/lessons/131530

 

프로그래머스

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

programmers.co.kr

[1차 코드]

특정 조건을 만족할 때 새로운 column을 만들어줘야하는 상황!

SQL에서 사용할 수 있는 조건문은 IF 조건문과 CASE 조건문이 있는데,

IF 조건문은 조건을 1개만 이용할 수 있고, CASE 조건문은 조건을 여러개 사용할 수 있다는 특징이 있다.

SELECT price,
    CASE 
    WHEN price < 10000 THEN 0
    WHEN price < 20000 THEN 10000
    WHEN price < 30000 THEN 20000
    WHEN price < 40000 THEN 30000
    WHEN price < 50000 THEN 40000
    WHEN price < 60000 THEN 50000
    WHEN price < 70000 THEN 60000
    WHEN price < 80000 THEN 70000
    ELSE 80000
    END AS price_group
FROM product

MAX(price)를 실행해봤을 떄 85000원인가? 가 최대 금액이었어서, 이런식으로 CASE 문을 작성했다.

금액대에 따라 price_group이 잘 만들어짐을 확인했다.

 

FROM절 서브쿼리를 이용해볼까? 하는 생각이 들었다.

SELECT product_id,
    CASE 
    WHEN price < 10000 THEN 0
    WHEN price < 20000 THEN 10000
    WHEN price < 30000 THEN 20000
    WHEN price < 40000 THEN 30000
    WHEN price < 50000 THEN 40000
    WHEN price < 60000 THEN 50000
    WHEN price < 70000 THEN 60000
    WHEN price < 80000 THEN 70000
    ELSE 80000
    END AS price_group
FROM product

 

이렇게 하면 product id와 해당 product가 속한 price_group을 뽑을 수 있다.

FROM절 서브쿼리를 이용하면 서브쿼리 결과물을 테이블처럼 활용할 수 있는데,

이때 AS로 이름을 붙여주는 것이 필요하다.

SELECT price_group,
    COUNT(*) AS products
FROM(SELECT product_id,
    CASE 
    WHEN price < 10000 THEN 0
    WHEN price < 20000 THEN 10000
    WHEN price < 30000 THEN 20000
    WHEN price < 40000 THEN 30000
    WHEN price < 50000 THEN 40000
    WHEN price < 60000 THEN 50000
    WHEN price < 70000 THEN 60000
    WHEN price < 80000 THEN 70000
    ELSE 80000
    END AS price_group
FROM product) AS grp
GROUP BY price_group
ORDER BY price_group

price_group 별로 갯수를 세야하므로 GROUP BY와 COUNT 함수를 같이 사용해주었다.

 

이렇게 풀면 답은 나온다.

하지만 CASE 문에 복붙 여러개 한게 효율적이지 못한것같아 다른 풀이를 찾아보았다.

 

[모범 답안]

price의 만원 단위를 활용하여 price_group 이라는 column을 만들어줄 수 있다.

자릿수에 TRUNCATE() 함수를 이용해 천의 자릿수 이하를 모두 버림해주면 된다.

TRUNCATE(숫자, 버릴 자릿수) : 숫자를 버릴 자릿수 아래로 버림

버릴 자릿수가 음수 --> 정숫값에 대해 버릴 자릿수를 작은 자릿수부터 세는 방식

버릴 자릿수가 양수 --> 소숫값에 대해 남길 자릿수를 앞에서부터 세는 방식

 

ex) TRUNCATE(1234.5678, -1) --> 1230

ex) TRUNCATE(1234.5678, 1) --> 1234.5

SELECT TRUNCATE(price, -4) AS price_group,
	COUNT(*) AS products
FROM product
GROUP BY price_group
ORDER BY price_group