2024.11.26.화 배운 것

kinkin_a·2024년 11월 26일

내일배움캠프 TIL

목록 보기
7/100

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
  • 결과는 같음. 서브쿼리가 더 정돈된 것 같다.

sql 5주차

  • 연산함수를 사용할 때 데이터값이 문자인 경우
    1) 자동으로 0으로 바꿔서 전체행수로 계산
    2) 코드로 null 값으로 바꿔 문자데이터를 제외한 행수로 계산(ex)if문)
  • coalesce(필드, 대체값) : 필드에서 null 데이터를 대체값으로 바꿈
  • 데이터 형식 상 문제는 없지만 상식적으로 문제가 있는 경우는 조건문을 사용
    (ex) 주문고객의 나이가 5,6세일 때: case, if, where 문등을 이용)
  • pivot table : 2개 이상의 기준으로 데이터를 집계할 때, 보기 쉽게 배열하여 보여주는 것을 의미.
    주로 max(if문)-group by/ count로 집계함
    과제코드
 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 함수를 한 번 더 복습해야겠다.

0개의 댓글