본문 바로가기
SQL

본 캠프 9일차 SQL TIL

by Data 학습자 2024. 7. 2.

오늘 풀어본 문제

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

 

프로그래머스

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

programmers.co.kr

PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCT로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000원 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.

 

1. 먼저 각 구간별로 값을 나누어 컬럼에 저장하기

SELECT 
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'
     WHEN PRICE < 90000 THEN '80000'
     WHEN PRICE < 100000 THEN '90000'
     END 'PRICE_GROUP'
FROM PRODUCT

 

2. 서브 쿼리를 활용한 뒤 각 금액 구간 별 그룹으로 묶어주기

SELECT PRICE_GROUP
FROM
(
SELECT 
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'
     WHEN PRICE < 90000 THEN '80000'
     WHEN PRICE < 100000 THEN '90000'
     END 'PRICE_GROUP'
FROM PRODUCT
) as P_G
GROUP BY PRICE_GROUP

 

3. 그룹간 중첩되는 가격 그만큼 숫자를 세기

SELECT PRICE_GROUP, COUNT(PRICE_GROUP)
FROM
(
SELECT 
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'
     WHEN PRICE < 90000 THEN '80000'
     WHEN PRICE < 100000 THEN '90000'
     END 'PRICE_GROUP'
FROM PRODUCT
) as P_G
GROUP BY PRICE_GROUP

 

4. 마지막으로 작은 금액을 오름차순으로 정렬하기

SELECT PRICE_GROUP, COUNT(PRICE_GROUP)
FROM
(
SELECT 
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'
     WHEN PRICE < 90000 THEN '80000'
     WHEN PRICE < 100000 THEN '90000'
     END 'PRICE_GROUP'
FROM PRODUCT
) as P_G
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP

 

이렇게 풀이를 하던 와중 WHEN을 너무 많이 쓰는게 지겨워 다른 풀이 방법이 있나 추가로 찾아보게 되었고 FLOOR 함수를 사용하면 굳이 저렇게 조건문을 길게 쓰지 않아도 쉽게 값을 구할 수 있다는 사실을 알게되었다.

SELECT 10000 *(FLOOR(price / 10000)) as price_level, COUNT(*) as product_count
FROM product
GROUP BY FLOOR(price / 10000)
ORDER BY price_level

 

실로 아름답고 멋지지 않은가? 이런 것을 두고 파이썬스럽다 라고 말을 하는 것 같다 아직 FLOOR 함수에 대해 완벽히 이해하진 못했지만 내일 튜터님과 대화를 하며 FLOOR 함수에 대한 전반적인 지식을 쌓아나갈 생각이다.

'SQL' 카테고리의 다른 글

본 캠프 11일차 SQL TIL  (0) 2024.07.06
본 캠프 10일차 SQL TIL  (0) 2024.07.06
본 캠프 8일차 SQL TIL  (0) 2024.07.01
본 캠프 7일차 SQL TIL  (0) 2024.06.30
본 캠프 6일차 SQL TIL  (0) 2024.06.29