[SQL] 데이터가 Not given/NULL일 때 연산하기

ch.2·2024년 7월 3일

SQL

목록 보기
6/9
post-thumbnail

조회한 데이터에 아무 값이 없을 때:
사용할 수 없는 데이터가 들어있거나, 데이터가 누락된 경우 Not given이라고 표시된다.
데이터가 없거나, 해당 데이터 항목이 특정 레코드에 적용되지 않는 경우 [NULL]이라고 표시된다.

없는 값을 제외해주기

데이터가 없을 때 예시

2번째 5 Napkin Burger 와 4번째 Alidoro의 rating 컬럼에 데이터 값이 없다.

select restaurant_name,
	   rating,
	   avg(rating) avg_rating1,
	   avg(if(rating = 'Not given', null, rating)) avg_rating2
from food_orders
group by restaurant_name
;
  • avg_rating1
    : mysql에서는, 사용할 수 없는 값일 때 해당 값을 0으로 간주하고 계산한다.
    → 4, 0, 5, 0, 4, 4 다 더하고 6으로 나누는 것.

  • avg_rating2
    :
    if문: rating의 값이 Not given 이라면 null값 반환, not given이 아닌 값이라면 rating값 그대로 반환.
    사용할 수 없는 값인 not given 을 null값으로 바꾼다.
    → 4, 5, 4, 4 더하고 4로 나누는 것.

상황에 따라 데이터값 전체에서 연산할지, 사용할 수 없는 값을 빼고 연산할지 선택하고 활용하면 됨!


cf. not given값을 제외하고 연산하는 방법 1

select restaurant_name,
	   avg(rating) avg_rating
from food_orders
where rating <> 'Not given'
group by 1
order by restaurant_name
;

where 문에서 not given 값을 포함하지 않는 데이터로만 연산하도록 했다.

rating 값이 아예 없는 Alidoro는 제외하고 출력됐다.


cf. not given값을 제외하고 연산하는 방법 2

select restaurant_name,
       avg(rating) avg_rating
from (
    select restaurant_name,
           case 
               when rating = 'Not given' then null
               else cast(rating as decimal) end rating
    from food_orders
) food_orders
group by restaurant_name
having avg(rating) is not null
order by restaurant_name;

case 문을 통해 not given값을 null로 변환하고, having 절에서 null 값을 제외한다.

  • cast(rating as decimal)
    : rating의 데이터 타입을 숫자형으로 변환.

마찬가지로 rating 값이 아예 없는 Alidoro는 제외하고 출력됐다.



다른 값으로 대체하기

평균값 혹은 중앙값 등 대표값을 이용해 대체하기도 한다.

  • 다른 값이 있을 때
    : if(조건, 컬럼명, 대체값)으로 연산하기
select restaurant_name,
	   avg(if(rating>=1, rating, 3)) avg_rating
from food_orders
group by 1
order by restaurant_name
;

같은 데이터를 이용하여 대체값을 3으로 계산하여 출력했다.


  • null값일 때
    : coalesce(컬럼명, 대체값)으로 연산하기
select b.name,
       b.age,
       coalesce(b.age,20),
       b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
order by case
			  when age is null then 0 else 1 end, age
              -- age컬럼에서 null인 값 먼저 불러오는 case when 구문
;

coalesce 함수를 이용해 age의 null값을 20으로 대체해 출력해보았다.

기존에 null값이었던 age 컬럼이 모두 20이라는 숫자로 대체되었다.

profile
데이터 분석 공부중

0개의 댓글