3주차 6강 내용 정리
select restaurant_name "식당", order_id "주문번호",
substr(addr, 1, 2) "지역",
delivery_time "배달시간",
price "주문금액",
round(
case when (delivery_time>25 and delivery_time<=30) then price*0.05*(if(addr like '서울%', 1.1, 1))
when delivery_time>30 then price*1.1*(if(addr like '서울%', 1.1, 1))
else 0 end
, 0) "수수료"
from food_orders;
답을 알고나면 그렇게 어렵지 않은데 혼자 생각해서 답을 찾아가는 과정은 아직 어색하고 어려움이 있다.
수수료를 깔끔하게 만들고 싶어서 round 함수를 어떻게 쓸까 하다가 case문 전체를 씌워버리면 되는 거였다.
처음에 계속 오류가 나서 혼자서 답을 찾아보려고 하나하나 다 바꿔보고 테스트해봤는데, 답은 "주문금액" 뒤에 쉼표를 빼먹은 거였...
select order_id "주문번호",
price "주문가격",
quantity "주문수량",
day_of_the_week "주문시기",
case when day_of_the_week="Weekday" then 3000*if(quantity>3, 1.2, 1)
when day_of_the_week="Weekend" then 3500*if(quantity>3, 1.2, 1)
else 0 end "배달할증료"
from food_orders;
select order_id "주문번호",
price "주문가격",
quantity "주문수량",
day_of_the_week "주문시기",
if(day_of_the_week='Weekday', 3000, 3500)*(if(quantity<=3, 1, 1.2)) "배달할증료"
from food_orders;
case문 대신 if를 써서 한줄로도 만들 수 있었다.
3주차 7강 내용 정리
숫자 계산이나 문자 가공 시 자주 발생하는 오류에 대해 배웠다.
엑셀에서도 이런 경우가 있어서 맥락은 이해했으나 직접 활용해볼만한 일이 생겨서 좀 더 이해가 될 듯하다.

123 : 숫자 / A-Z : 문
- 숫자로 변경 cast(if(rating='Not given', '1', rating) as decimal)
- 문자로 변경 concat(restaurant_name, '-', cast(order_id as char))
3주차 마무리 문제 ( 배달시간이 늦었는지 판단하는 값을 만들기 )
select order_id "주문번호",
restaurant_name "식당",
day_of_the_week "주문시기",
delivery_time "배달시간",
case when (day_of_the_week='Weekday' and delivery_time<25)
or (day_of_the_week='Weekend' and delivery_time<30)
then 'On-time'
else 'Late' end "지연여부"
from food_orders;
어렵지 않게 정답에 도달할 수 있었다.
뭔가 중복된 내용들이 있는 듯해서 간략하게 만들기 위해 여러가지 고민을 해봤지만 방법을 직접 찾지는 못 했다.
chatgpt를 통해 or을 활용해 then 'On-time' 을 한번 생략할 수 있게 만들어봤다.
달리기반 4번 퀘스트
select c.customername "고객명",
count(o.orderid) "주문 건수",
coalesce(sum(o.totalamount), 0) "총 주문 금액"
from customerss c
left join orderss o on c.customerid = o.customerid
group by 1;
select c.country "국가",
c.customername "최고 주문 고객",
sum(o.totalamount) "최고 주문 금액"
from customerss c
join orderss o on c.customerid = o.customerid
group by 1,2
having sum(o.totalamount) = (
select max(sumspent)
from (select sum(o2.totalamount) as sumspent
from customerss c2
join orderss o2 on c2.customerid = o2.customerid
where c2.country = c.country
group by c2.customerid) as subquery
);
1번은 left join과 coalesce을 활용하는게 익숙하지 않긴 했으나 할만했으나 2번은 아직 4주차 강의를 안 들어서 직접 답을 찾지는 못 했다. 사전캠프 기간동안 타지에 있어서 시간동안 온전한 집중이 부족했는데 본캠프부터 쭉쭉 진도를 빼야겠다.