CODING/스파르타 내일배움캠프 TIL

TIL 3일차_2024.12.12

codingTrip 2024. 12. 12. 17:52

엑셀보다 쉽고 빠른 SQL 3주차

미리 해당 문법을 알아두는 거슨 중요하지만 구글링이 중요하다

sql 스타일마다 조금씩 문법이 달라서 잘 되는지 확인하는 작업이 중요하다.

긴 조건이라도 차분하게 생각해보고 사용하는 방법이 중요하다.

 

정답과는 다르게 작성했다. 이것저것 고민해보는 자세가 중요하다고 생각한다.

select order_id,  
       restaurant_name,
       day_of_the_week,
       delivery_time,
       case when day_of_the_week='Weekday' and delivery_time>=25 then 'Late'
            when day_of_the_week='Weekend' and delivery_time>=30 then 'Late'
            else 'On-time' end "지연여부"
from food_orders

 

--숫자로 변경
cast(if(rating='Not given', '1', rating) as decimal) 

--문자로 변경
concat(restaurant_name, '-', cast(order_id as char))

엑셀보다 쉽고 빠른 SQL 4주차

1) 서브쿼리

안쪽 괄호에 있는 쿼리부터 천천히 읽는 법을 알려주셔서 좋았다.

 

2) 조인

엑셀의 vlookup과 집합 그림으로 설명을 해주신 점이 신선했다.

출처 : 스파르타 엑셀보다 쉽고 빠른 SQL - 4주차 강의자료
출처 : 스파르타 엑셀보다 쉽고 빠른 SQL - 4주차 강의자료

 

3) 주의사항

, 하나라도 잘 봐야 하고, 에러가 나도 당황하지 않고 원인을 찬찬히 읽으면서 발견하는 습관을 들여야 한다.

 

4) 강의 숙제

 식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기

  • 평균 음식 주문 금액 기준 : 5,000 / 10,000 / 20,000 / 30,000 초과
  • 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상
  • 두 테이블 모두에 데이터가 있는 경우만 조회, 식당 이름 순으로 오름차순 정렬

식당별 평균 음식 주문 금액과 주문자의 평균 연령을 기반으로 Segmentation 하기

- 평균 음식 주문 금액 기준 : 5,000 이하 / ~10,000 / ~30,000 / 30,000 초과

- 평균 연령 : ~ 20대 / 30대 / 40대 / 50대 이상

 

=> 이상한 점 : 문제와 정답의 Segmentation 기준이 다르다는 것이다.

심지어 정답 쿼리를 실행한 결과가 결과물 예시 사진과 다르다는 것이다.

그래도 서브쿼리와 조인을 활용해서 스스로 잘 작성했음에 만족하겠다.

select restaurant_name,
       avg_price, avg_age,
	   case when avg_price <= 5000 then 'price_group1'
	        when avg_price > 5000 and avg_price <= 10000 then 'price_group2'
	        when avg_price > 10000 and avg_price <= 20000 then 'price_group3'
	        when avg_price > 20000 and avg_price <= 30000 then 'price_group4'
	        when avg_price > 30000 then 'price_group5'
	   end price_group,
	   case when avg_age <= 29 then 'age_group1'
	        when avg_age between 30 and 39 then 'age_group2'
	        when avg_age between 40 and 49 then 'age_group3'
	        when avg_age >= 50 then 'age_group4'
	   end price_group   
from
(
select f.restaurant_name, 
	   avg(f.price) avg_price, 
	   avg(c.age) avg_age
from food_orders f inner join customers c on f.customer_id = c.customer_id
group by 1
) a
order by 1
;