1. [실습] SQL로 간단한 User Segmentation 해보기
1-1. 10세 이상, 30세 미만의 고객의 나이와 성별로 그룹 나누기(이름도 같이 출력)
- 구문으로 만들기
- 어떤 테이블에서 데이터를 뽑을 것인가 - customers
- 어떤 컬럼을 이용할 것인가 - age,gender,name
- 어떤 조건을 지정해야 하는가 - between 10 and 30
- 어떤 함수 (수식) 을 이용해야 하는가- group by age, gender
- 전체 구조로 합치기
SELECT name,age,gender,
CASE WHEN (age BETWEEN 10 AND 19) AND gender='male' then '10대 남자'
WHEN (age BETWEEN 10 AND 19) AND gender='female' then '10대 여자'
WHEN (age BETWEEN 20 AND 29) AND gender='male' then '20대 남자'
WHEN (age BETWEEN 20 AND 29) AND gender='female' then '20대 여자'
end '그룹'
FROM customers
WHERE age BETWEEN 10 AND 30
1-2. 음식 단가, 음식 종류 별로 음식점 그룹 나누기
- 구문으로 만들기
- 어떤 테이블에서 데이터를 뽑을 것인가 - food_orders
- 어떤 컬럼을 이용할 것인가 - price,cuisine_type
- 어떤 조건을 지정해야 하는가 -
- 어떤 함수 (수식) 을 이용해야 하는가- case or if
- 전체 구조로 합치기
1차
SELECT price,
cuisine_type,
CASE WHEN(cuisine_type = 'Korean') then '한식'
WHEN(cuisine_type = 'Japanese') then '아시아식'
WHEN(cuisine_type = 'Chinese') then '아시아식'
WHEN(cuisine_type = 'Thai') then '아시아식'
WHEN(cuisine_type = 'Vietnamese') then '아시아식'
WHEN(cuisine_type = 'Indian') then '아시아식'
ELSE '기타'
END '음식점 그룹'
CASE WHEN (price < 5000) then '5000'
WHEN(price BETWEEN 5000 AND 15000) then '15000'
ELSE '그 이상'
END '가격'
FROM food_orders
여기서는 일단 쿼리가 너무너무 길었고, price < 5000부분에서 오류가 계속 떴다.
뭐가 문제인지 찾아보니, 간단했다,, 쉼표 문제였다 , ㅠㅠㅠㅠㅠㅠㅠ 그 외에 자잘한거는 있으나 없으나 똑같다고해서 넣ㅈ ㅣ않겠다.
2차
SELECT price,
cuisine_type,
CASE WHEN(cuisine_type = 'Korean') then '한식'
WHEN(cuisine_type = 'Japanese') then '아시아식'
WHEN(cuisine_type = 'Chinese') then '아시아식'
WHEN(cuisine_type = 'Thai') then '아시아식'
WHEN(cuisine_type = 'Vietnamese') then '아시아식'
WHEN(cuisine_type = 'Indian') then '아시아식'
ELSE '기타'
END AS '음식점 그룹',
CASE WHEN price < 5000 then '5000'
WHEN price BETWEEN 5000 AND 15000 then '15000'
ELSE '그 이상'
END AS '가격'
FROM food_orders
여기까지하고 문제가 있었다면,,, 당장 주어진 문제는 '단가'를 계산해야하는것이었다 ,, ^^ ,,,,
하지만 우선 이 줄줄 적어놓은 쿼리를 우선 정리할 필요성이 있어서, 이리저리 알아 본 결과 'IN'을 까먹고있었다 ..
복습의 중요성 ..
3차
SELECT price,
cuisine_type,
CASE WHEN cuisine_type = 'Korean' THEN '한식'
WHEN cuisine_type IN ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') THEN '아시아식'
ELSE '기타'
END AS '음식점 그룹',
CASE WHEN price < 5000 THEN '5000'
WHEN price BETWEEN 5000 AND 15000 THEN '15000'
ELSE '그 이상'
END AS '가격'
FROM food_orders;
다 똑같은 아시아식이면 결국 묶어서 포함시키면 되니까 포함시켰다 그랬더니 확실히 깔끔해졌다.
이제 단가를 계산해볼려고 하는데, 단가는 가격/수량이다, 근데 여기서 5000 15000 기타 이렇게 3가지랑 한식과 아시아식 이렇게 2가지가 있으니 5000원 미만일때 한식과 아시아식 하나랑
5000원~15000원 사이일때 한식과 아시아식이랑, 15000원 이상일때 기타까지 3가지다 그럼 조건식(case)문을 3개쓰면 될 것 같다.
근데 아무리 생각해도 정리가 잘 안됫다 ,, case의 이해도가 부족한 탓일까 ;-; ㅠㅠ
결과
결국 풀다 풀다 막혀서 챗지피티의 힘을 빌렸다, 이걸 보고 다시 분석하고 내일 다시 또 풀어보는걸로 !!
SELECT restaurant_name,
price/quantity AS "단가",
cuisine_type,
order_id,
CASE WHEN price/quantity < 5000 THEN
CASE WHEN cuisine_type = 'Korean' THEN '한식1'
WHEN cuisine_type IN ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') THEN '아시아식1'
ELSE '기타1'
END
WHEN price/quantity BETWEEN 5000 AND 15000 THEN
CASE WHEN cuisine_type = 'Korean' THEN '한식2'
WHEN cuisine_type IN ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') THEN '아시아식2'
ELSE '기타2'
END
ELSE
CASE WHEN cuisine_type = 'Korean' THEN '한식3'
WHEN cuisine_type IN ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') THEN '아시아식3'
ELSE '기타3'
END
END AS "식당 그룹"
FROM food_orders;
분석
CASE WHEN price/quantity < 5000 THEN
CASE WHEN cuisine_type = 'Korean' THEN '한식1'
WHEN cuisine_type IN ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') THEN '아시아식1'
ELSE '기타1'
END
여기부터 보자!
5000원 미만일때 한식,아시아식 그리고 기타를 나타내고 있다.
WHEN price/quantity BETWEEN 5000 AND 15000 THEN
CASE WHEN cuisine_type = 'Korean' THEN '한식2'
WHEN cuisine_type IN ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') THEN '아시아식2'
ELSE '기타2'
END
여기는 5000원~15000원 사이의 한식과, 아시아식,기타를 나타내고있고
ELSE
CASE WHEN cuisine_type = 'Korean' THEN '한식3'
WHEN cuisine_type IN ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') THEN '아시아식3'
ELSE '기타3'
END
END AS "식당 그룹"
여기는 15000이상일때! 그리고 전체적으로 조건1(5000원 미만일때) 조건2(5000원~15000원 사이일때)를 만족하지 못한 나머지(15000원 이상) !!
if문 중첩이라고 생각하면 편할 것 같다 !!
2. [실습] 조건문으로 서로 다른 식을 적용한 수수료 구해보기 - 복습후 다시
2-1. 지역과 배달시간을 기반으로 배달수수료 구하기(식당 이름, 주문 번호 함께 출력)
- 구문으로 만들기
- 어떤 테이블에서 데이터를 뽑을 것인가 -
- 어떤 컬럼을 이용할 것인가 -
- 어떤 조건을 지정해야 하는가 -
- 어떤 함수 (수식) 을 이용해야 하는가-
- 전체 구조로 합치기
2-2. 주문 시기와 음식 수를 기반으로 배달할증료 구하기
- 구문으로 만들기
- 어떤 테이블에서 데이터를 뽑을 것인가 -
- 어떤 컬럼을 이용할 것인가 -
- 어떤 조건을 지정해야 하는가 -
- 어떤 함수 (수식) 을 이용해야 하는가-
- 전체 구조로 합치기
1 ~ 2. 실습 회고
우선, 문제 이해도가 너무 떨어진다, 결과 이미지를 보지 못하면 뭘 써야하는지 잘 감을 못잡음
(if, case, substr, concat ... 등등) 많은 종류가 있지만 아직까지 간단한 것만 알고있음.
반복학습 + 많은 문제풀이가 필요할 것 같다.
3. Data Type 오류 해결하기
- 문자, 숫자를 혼합하여 함수에 사용 할 때에는 데이터 타입을 변경해줘야함
## 숫자로 변경
CAST(IF(rating='Not given', '1', rating) AS decimal)
## 문자로 변경
CONCAT(restaurant_name, '-', CAST(order_id AS char))
이 부분은 따로 포스팅하는걸로!!!
4. 3주차 숙제
- 다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.
- 주중 : 25분 이상
- 주말 : 30분 이상
- 구문으로 만들기
- 어떤 테이블에서 데이터를 뽑을 것인가 - food_orders
- 어떤 컬럼을 이용할 것인가 - delivery_time,day_of_the_week
- 어떤 조건을 지정해야 하는가 - delivery_time >= 25 , delivery_time >= 30
- 어떤 함수 (수식) 을 이용해야 하는가- if or case
- 전체 구조로 합치기
SELECT order_id '고객 번호',
restaurant_name '가게 이름',
day_of_the_week '주말 여부',
delivery_time '배달 시간',
CASE WHEN (delivery_time >= 25 AND day_of_the_week = 'Weekday') THEN '늦음'
WHEN (delivery_time >= 30 AND day_of_the_week = 'Weekend') THEN '늦음'
ELSE '정시'
END AS '배달지연여부'
FROM food_orders
'❄️ 내일배움캠프 7기' 카테고리의 다른 글
[사전캠프/SQL] JOIN이란? / 4주차 숙제 (1) | 2024.09.11 |
---|---|
[사전캠프/SQL] SubQuery(추가 내용 수정중) (2) | 2024.09.10 |
[사전캠프/SQL] 조건에 따라 포맷을 다르게 변경(IF,CASE) (4) | 2024.09.08 |
[SQL] SQL로 가공하기(REPLACE,SUBSTRING,CONCAT) (1) | 2024.09.07 |
[사전캠프/SQL] 공부하다보니 팀 프로젝트 시간이 왔어요! (0) | 2024.09.06 |