SQL의 기본 구조는 쉽다.
SELECT ..
FROM ..
[WHERE ..]
[GROUP BY ..]
[ORDER BY ..]
이제 여기서 조건문을 가지고 응용할 수 있는 분할(Segmentation) 작업을 할 수 있다.
조금 헷갈리니까 여기서 내 것으로 만들기 위해 복습 겸 끄적여본다.
SQL문에서 분할작업을 한다는 것은 예를들어 테이블의 [가격] 데이터가
0원 ~ 9,999원의 범위라면 "초저가"
10,000원 ~ 19,999원 이라면 "중저가"
20,000원 ~ 29,999원 이라면 "보통"
30,000원 ~ 무한대 라면 "초고가"
이런 식으로 범위마다 라벨링을 하는 것. 어떻게 보면 그룹화하는 것이라 볼 수 있겠다. 실제로 같은 값으로 치환시켰으니 그룹화 쿼리(GROUP BY)가 잘 될 것이다.
SELECT 문에서 작업해야 한다. 왜?
어떤 표현 범위에서 해당하는 값이 나타낼 또 다른 표현으로 치환되어 나오는 것일 뿐
결국 표현하고자 하는 항목이기 때문.
그렇다면.. 어떻게 일정 범위마다 다른 표현을 나타낼 수 있을까?
CASE-END문과
CASE
WHEN (조건1) THEN (조건1 참일 때 결과값)
WHEN (조건2) THEN (조건2 참일 때 결과값)
..
ELSE (위 조건들이 거짓일 때)
END
또는 다음 IF문
IF(조건, 조건이 참일 때, 조건이 거짓일 때)
위 두 조건문을 사용해야한다.
다음은 JOIN 실습 중인 쿼리문이다.
avg(price)와 avg(age)를 구간 별로 segmentation 하는 것이 목표다.
SELECT restaurant_name, avg(price), avg(age)
FROM food_orders a INNER JOIN customers b ON a.customer_id = b.customer_id
GROUP BY 1
ORDER BY restaurant_name
나누고자 하는 구간은 이렇다.
평균 음식 금액( avg(price) )
0 ~ 5,000
5,001 ~ 10,000
10,001 ~ 30,000
30,001 ~
평균 연령( avg(age) )
0 ~ 29대
30대 ~ 39대
40대 ~ 49대
50대 ~
위를 토대로 SELECT 문에 적절히 CASE문을 사용해보겠다.
SELECT restaurant_name,
CASE WHEN avg(price) <= 5000 THEN "price_group1",
WHEN avg(price) <= 10000 THEN "price_group2",
WHEN avg(price) <= 30000 THEN "price_group3"
ELSE "price_group4"
END price_group,
CASE WHEN avg(age) <= 29 THEN "age_group1",
WHEN avg(age) <= 39 THEN "age_group2",
WHEN avg(age) <= 49 THEN "age_group3"
ELSE "age_group4"
END age_group
FROM food_orders a INNER JOIN customers b ON a.customer_id = b.customer_id
GROUP BY 1
ORDER BY restaurant_name

실행 결과, 잘 나온 것 같다.
마무리
SQL 문에서의 간단한 Segmentation은
1. SELECT 문에 작성
2. 조건문(IF, CASE문)으로 구간별 표현
3. END 뒤에 별명 (AS 생략)