최대 1 분 소요

문제 링크

정답

-- 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 대신 사용할 수 있는 조건
  • 가격대 별 집계: 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 풀이로 접근해야 함