4주차 숙제
1) 서브쿼리 없이 작성
select fo.restaurant_name ,avg(fo.price) as '가격', avg(c.age) as '나이 평균',
case when avg(fo.price)>30000 then 'price_group4'
when avg(fo.price)between 20000 and 30000 then 'price_group3'
when avg(fo.price) between 10000 and 20000 then 'price_group2'
when avg(fo.price) between 5000 and 10000 then 'price_group1'
else 'price_group0' end 'price_group',
case when avg(c.age)>50 then 'age_group4'
when avg(c.age)>40 then 'age_group3'
when avg(c.age)>30 then 'age_group2'
else 'age_group1' end 'age_group'
from food_orders fo inner join customers c on fo.customer_id=c.customer_id
group by fo.restaurant_name
order by fo.restaurant_name
2)서브쿼리
select n as 'restaurant_name', p as '가격', a as '나이 평균', case when p>30000 then 'price_group4'
when p between 20000 and 30000 then 'price_group3'
when p between 10000 and 20000 then 'price_group2'
when p between 5000 and 10000 then 'price_group1' else 'price_group0' end 'price_group',
case when a>50 then 'age_group4'
when a>40 then 'age_group3'
when a>30 then 'age_group2'
else 'age_group1' end 'age_group'
from(
select avg(fo.price) p,avg(c.age) a,fo.restaurant_name n
from food_orders fo inner join customers c on fo.customer_id=c.customer_id
group by fo.restaurant_name
order by fo.restaurant_name
)f
select cui,
max(if(age=50,cc,0)) "50대",
max(if(age=40,cc,0)) "40대",
max(if(age=30,cc,0)) "30대",
max(if(age=20,cc,0)) "20대",
max(if(age=10,cc,0)) "10대" 2.음식타입별로 그룹화해서 max if문으로 주문건수 세기
from
(select fo.cuisine_type cui,
case when c.age between 10 and 19 then 10
when c.age between 20 and 29 then 20
when c.age between 30 and 39 then 30
when c.age between 40 and 49 then 40
when c.age between 50 and 59 then 50 end age,
count(1) cc//
1.먼저 서브쿼리에서 연령별로 그룹화해준 후 주문건수를 카운트함
from food_orders fo inner join customers c on fo.customer_id =c.customer_id
where c.age between 10 and 59
group by 1,2
)a
group by 1
max가 그룹의 최댓값을 반환하는 함수로 알고 있는데,
왜 그룹별 주문건수를 더한 값을 반환하는지 잘 이해가 안간다.
sum이 아닌가?
실험삼아 sum으로 바꿔보니 결과값은 같았다.
rank와 window 함수를 한 번 더 복습해야겠다.