문제내용 : 44. 가격대 별 상품 정리
메서드 정리는 아니지만 , 가격 별 정리 쿼리를 정리해두는 편이 좋을꺼 같아서 적어둡니다.
정답 1. 가격을 범위로 지정하여 구간별 상품 개수 집계하기
#1 모든 경우의 수
SELECT
FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
COUNT(product_id) AS PRODUCTS
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP ASC;
#2 경우의 수를 하나하나 설정
SELECT
CASE
WHEN PRICE < 10000 THEN '0 ~ 10000'
WHEN PRICE >= 10000 AND PRICE < 20000 THEN '10000 ~ 20000'
WHEN PRICE >= 20000 AND PRICE < 30000 THEN '20000 ~ 30000'
WHEN PRICE >= 30000 AND PRICE < 40000 THEN '30000 ~ 40000'
ELSE '40000 이상'
END AS PRICE_GROUP,
COUNT(PRODUCT_ID) AS PRODUCTS
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP ASC;
번외
2. 가격 평균과 분산을 추가로 계산하기
SELECT
FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
COUNT(PRODUCT_ID) AS PRODUCTS,
ROUND(AVG(PRICE), 2) AS AVERAGE_PRICE,
ROUND(STDDEV(PRICE), 2) AS PRICE_STDDEV
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP ASC;
- AVG(PRICE)는 각 가격 구간의 평균 가격을 구합니다.
- STDDEV(PRICE)는 가격의 표준 편차(변동성)를 계산하여 각 가격 구간의 변동성을 보여줍니다.
- 이렇게 하면 단순히 구간별 상품 개수를 세는 것 외에도 구간별 평균과 분산을 파악할 수 있어 더 다양한 분석이 가능합니다.
사용예시 : 가격분석 할 경우에 많이 사용된다 .
3. 특정 가격대에 속하는 상품 비율 계산하기 *중요*
WITH TOTAL_PRODUCTS AS (
SELECT COUNT(*) AS TOTAL FROM PRODUCT
)
SELECT
FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
COUNT(PRODUCT_ID) AS PRODUCTS,
ROUND((COUNT(PRODUCT_ID) / (SELECT TOTAL FROM TOTAL_PRODUCTS)) * 100, 2) AS PRODUCT_PERCENTAGE
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP ASC;
- 이 쿼리는 먼저 TOTAL_PRODUCTS라는 WITH 절을 사용하여 전체 상품 개수를 구한 뒤, 각 가격 구간에 속하는 상품의 비율을 계산합니다.
- ROUND 함수로 계산된 비율을 소수 둘째 자리까지 반올림하여 퍼센트로 나타냅니다.
4. 누적 합계로 가격 구간별 총 매출 계산
SELECT
FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
COUNT(PRODUCT_ID) AS PRODUCTS,
SUM(PRICE) AS TOTAL_SALES,
SUM(SUM(PRICE)) OVER (ORDER BY FLOOR(PRICE / 10000) * 10000) AS CUMULATIVE_SALES
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP ASC;
- SUM(PRICE)는 각 가격 구간에서 발생한 총 매출을 계산합니다.
- SUM(SUM(PRICE)) OVER (...)는 각 구간의 총 매출을 누적하여 보여줍니다. 즉, 첫 번째 구간부터 해당 구간까지의 매출 합계를 순차적으로 보여줍니다.
5. 가장 비싼 상품을 가격 구간별로 찾기 *중요*
SELECT
FLOOR(PRICE / 10000) * 10000 AS PRICE_GROUP,
MAX(PRICE) AS MAX_PRICE
FROM
PRODUCT
GROUP BY
PRICE_GROUP
ORDER BY
PRICE_GROUP ASC;
- MAX(PRICE)는 각 가격 구간에서 가장 비싼 상품의 가격을 보여줍니다.
- 가격 구간별로 고가 상품을 분석할 때 유용합니다.