사전캠프 9일차 - SQL 기초(8)

이상민·2024년 8월 1일

TIL

목록 보기
8/50

만약 조회한 데이터에 아무런 값이 없다면 어떻게 해야할까?

  • 아래 그림처럼 테이블에 잘못된 값이 들어있을 수 있다.

  • 이러한 사용할 수 없는 데이터가 들어있거나, 값이 없는 경우 어떻게 처리할까?

  • 방법1) 없는 값을 제외해주기
    -Mysql 에서는 사용할 수 없는 값일 때 해당 값을 연산에서 제외해준다. → 0으로 간주
    즉 평균 rating 을 구하는 쿼리를 아래와 같이 작성했을 때 실제 연산에 사용되는 데이터는 다음과 같다.

    select restaurant_name,
          avg(rating) average_of_rating,
          avg(if(rating<>'Not given', rating, null)) average_of_rating2
    from food_orders
    group by 1


  • 따라서, 명확하게 연산을 지정해주기 위해 null 문법을 이용해야 한다.

    select a.order_id,
          a.customer_id,
          a.restaurant_name,
          a.price,
          b.name,
          b.age,
          b.gender
    from food_orders a left join customers b on a.customer_id=b.customer_id
    where b.customer_id is not null 
  • null 제거 전

  • null 제거 후

조회한 데이터가 상식적이지 않은 값을 가지고 있다면 어떻게 해야할까?

  • 분석을 하다보면 상식적이지 않은 데이터가 나올 때가 있다. 예를들면 보통 음식을 주문한 고객들은 20세 이상인 성인인 경우가 많은데, 데이터를 보면 2살과 같이 상식적이지 않은 값들을 확인할 수 있다.
  • 이러한 문제는 아래와 같은 조건문으로 값의 범위를 지정해 해결할 수 있다.
select customer_id, name, email, gendor, age,
       case when age<15 then 15
            when age>80 then 80
            else age end "범위를 지정해준 age"
from customers
  • 범위를 지정해준 결과, 15세 미만인 경우 15, 80세 초과인 경우 80으로 각각 범위를 지정해 대체된 것을 확인할 수 있다.

SQL 로 Pivot Table 만들어보기

  • 우리의 궁극적인 목적은 SQL 로 업무를 효율적으로 하는 것이다. 데이터를 뽑아 엑셀로 가공하지 않고, 바로 Pivot table 을 만드는 방법을 알아보자 (Pivot table 이란? : 2개 이상의 기준으로 데이터를 집계할 때, 보기 쉽게 배열하여 보여주는 것을 의미한다.)
  • 성별, 연령별 주문건수를 이용해 Pivot Table 뷰를 직접 한번 만들어보자 (나이는 10~59세 사이, 연령 순으로 내림차순)
    -먼저 성별, 연령별 주문건수 집계하기
select b.gender,
       case when age between 10 and 19 then 10
            when age between 20 and 29 then 20
            when age between 30 and 39 then 30
            when age between 40 and 49 then 40
            when age between 50 and 59 then 50 end age,
       count(1)
from food_orders a inner join customers b on a.customer_id=b.customer_id
where b.age between 10 and 59
group by 1, 2
  • case when 을 이용해 10살부터 19살까지 10대, 20살부터 29살까지 20대를 지정해 50대까지 지정해준뒤 성별과 나이를 기준별로 그룹화 해준다.

-그 다음 Pivot view 구조 만들기

select age,
       max(if(gender='male', order_count, 0)) male,
       max(if(gender='female', order_count, 0)) female
from 
(
select b.gender,
       case when age between 10 and 19 then 10
            when age between 20 and 29 then 20
            when age between 30 and 39 then 30
            when age between 40 and 49 then 40
            when age between 50 and 59 then 50 end age,
       count(1) order_count
from food_orders a inner join customers b on a.customer_id=b.customer_id
where b.age between 10 and 59
group by 1, 2
) t
group by 1
order by age
  • 나이를 기준으로 해준뒤 내림차순 해준 결과 남성과 여성의 연령별 주문 건수를 확인할 수 있게 되었다.

0개의 댓글