오늘 풀어본 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131530
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 |