[Programmers] 가격대 별 상품 개수 구하기
정답
-- PRODUCT: PRODUCT_ID, PRODUCT_CODE, PRICE
WITH RECURSIVE
MAX_PRICE AS (
SELECT MAX(PRICE) AS P
FROM PRODUCT
),
PRICE_TABLE AS (
SELECT 0 AS PRICE_GROUP
UNION ALL
SELECT PRICE_GROUP + 10000 AS PRICE_GROUP
FROM PRICE_TABLE, MAX_PRICE
WHERE PRICE_GROUP < MAX_PRICE.P
)
SELECT
T2.PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM PRODUCT AS T1
JOIN PRICE_TABLE T2
ON T1.PRICE BETWEEN T2.PRICE_GROUP AND T2.PRICE_GROUP + 9999
GROUP BY T2.PRICE_GROUP
ORDER BY T2.PRICE_GROUP
;
✅ Point
- 가격대 구하기
- 0원 대에서 부터 최고 가격대까지의 범위를 알아야 함.
- 이를 알기 위해 with로 최고 가격을 변수로 지정하고, 이를 기준으로 반복문 통해 가격 범위 (price_table) 형성
- 가격대별 개수 구하기
- product의 price가 price_table의 price_group 사이에 존재하는 조건으로 table join
FLOOR(T1.PRICE / 10000) = FLOOR(T2.PRICE_GROUP / 10000)
between 대신 사용할 수 있는 조건
- product의 price가 price_table의 price_group 사이에 존재하는 조건으로 table join
- 가격대 별 집계: group by, 그룹 결 개수 구하기: count(*)
다른 풀이
- cte를 선언하지 않고 풀기
-- PRODUCT: PRODUCT_ID, PRODUCT_CODE, PRICE SELECT FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP, COUNT(*) AS PRODUCTS FROM PRODUCT GROUP BY PRICE_GROUP ORDER BY PRICE_GROUP;
- 현재 채점 기준으로서는 정답이지만, 위 풀이는 특정 구간이 0개인 경우는 표시할 수 없음
- (0개 인 구간까지 표시하고 싶다면, CTE 는 필수적!)
- WITH RECURSIVE + JOIN 풀이로 접근해야 함