SQL/MySQL - 프로그래머스

[Lv.2] 가격대 별 상품 개수 구하기 [case when, between]

셈뇽 2024. 5. 6. 18:56
문제 파악

  • 출력할 컬럼 : 만원 단위의 가격대 별 상품 개수  SELECT
  • 데이터를 가져올 테이블 : product ⇒ FROM
  • 조회 순서 : 가격대 기준 오름차순⇒ ORDER BY
  • 적용할 조건 : 만원 단위의 가격대 별로 숫자 집계 ⇒ Case when

 

문제 해결 과정

 

💡 Case when

조건에 따라 구분하고 싶을 때 사용

# + 등급 나누기
SELECT U.USERID, U.NAME, SUM(B.PRICE*B.AMOUNT) AS `TOTAL_PRICE`,
	## IF 문과 같이 WHEN 조건에 순차적으로 걸리고, 
    # ELSE를 통해 나머지를 처리할 수 있다
	CASE 
		# WHEN 안에 별칭을 쓰면 실행이 안된다!! 이 멍청한...SQL..
		WHEN( SUM(B.PRICE*B.AMOUNT) >=1500 ) THEN 'VVIP'
        WHEN( SUM(B.PRICE*B.AMOUNT) >=1000 ) THEN 'VIP'
        WHEN( SUM(B.PRICE*B.AMOUNT) >0 ) THEN 'BASIC'
        ELSE 'GHOST'
    END AS `CUSTOMER_CLASS`
    FROM BUYTBL B RIGHT JOIN USERTBL U
			ON B.USERID = U.USERID
		GROUP BY B.USERID, U.NAME
		ORDER BY `TOTAL_PRICE` DESC;
		
		
# + 등급 나누기
SELECT U.USERID, U.NAME, SUM(B.PRICE*B.AMOUNT) AS `TOTAL_PRICE`,
	## IF 문과 같이 WHEN 조건에 순차적으로 걸리고, 
    # ELSE를 통해 나머지를 처리할 수 있다
	CASE 
		WHEN( `TOTAL_PRICE` >=1500 ) THEN 'VVIP'
        WHEN( `TOTAL_PRICE` >=1000 ) THEN 'VIP'
        WHEN( `TOTAL_PRICE` >0 ) THEN 'BASIC'
        ELSE 'GHOST'
    # 새로운 컬럼을 지정
    END AS `CUSTOMER_CLASS`
    FROM BUYTBL B RIGHT JOIN USERTBL U
			ON B.USERID = U.USERID
		GROUP BY B.USERID, U.NAME
		ORDER BY `TOTAL_PRICE` DESC;

 

주의할 점 !!

WHEN 절에 SELECT 에서 설정한 별칭을 사용하면 ⇒ UNKNOWN COLUMN 오류가 나타나면서 실행되지 않는다.

⇒ CASE~ WHEN 절은 테이블의 원천 소스를 가져오기 때문에 파생변수는 가져올 수 없다

 

 

💡 Between

범위를 지정할 때 사용

 

format : 컬럼명 BETWEEN A AND B

⇒ 해당 컬럼에서 A와 B 사이의 값을 조회 (A, B값을 포함)

PRICE BETWEEN 500 AND 1000
PRICE >= 500 AND PRICE <= 1000

 

format : 컬럼명 NOT BETWEEN A AND B

  해당 컬럼에서 해당 범위 외의 값을 조회

PRICE NOT BETWEEN 500 AND 1000
PRICE < 500 OR PRICE > 1000

 

 

문제 해결

 

> 완성 코드

select 
    case 
        when price between 0 and 9999 then "0"
        when price between 10000 and 19999 then "10000"
        when price between 20000 and 29999 then "20000"
        when price between 30000 and 39999 then "30000"
        when price between 40000 and 49999 then "40000"
        when price between 50000 and 59999 then "50000"
        when price between 60000 and 69999 then "60000"
        when price between 70000 and 79999 then "70000"
        when price between 80000 and 89999 then "80000"
    end as `PRICE_GROUP`,
    count(*) as `PRODUCTS`
from product
group by `PRICE_GROUP`
order by `PRICE_GROUP`;