인프런 커뮤니티 질문&답변

Malibu님의 프로필 이미지
Malibu

작성한 질문수

초보자를 위한 BigQuery(SQL) 입문

5-6. JOIN 연습 문제 1~2번

5-6 1번 문제

해결된 질문

작성

·

84

0

image.png

안녕하세요. where에 조건을 걸기 전에 조인하고 한번 해봤는데 결과 갯수가 차이가 있습니다. 어떤 부분 때문에 이런 차이가 발생할까요?

답변 1

0

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

Malibu님 안녕하세요! 문제 잘 풀고 계시네요 💪

COUNTIF에서 status에 IN을 걸어서 풀어주셨네요.

이런 경우 결과 갯수가 차이가 있으면, 저는 아래와 같은 방법으로 해결합니다(바로 답을 공유드리는 것보다 제가 해당 질문을 보고 어떤 방식으로 확인했는지 공유드릴게요)

 

 

1. 어디서 차이가 났는가?

 차이가 난 부분이 어디인지 알아내야 합니다. 이를 위해 쿼리문에서 pokemon_cnt DESC를 줬기 때문에 두개의 차이를 보기 편할거에요

 

BigQuery 콘솔에서 두개의 결과를 동시에 띄워서 보기도 하고, 결과를 JSON으로 추출해서 JSON_DIFF 도구를 사용해 비교해보곤 합니다(https://www.jsondiff.com/)

 

image

확인해보면 현재 166, 153(이건 제가 강의에서 공유한 쿼리를 사용한 결과)가 나오네요. 첫 페이지를 자세히 보면 버터풀 ~ 왕콘치까지 모두 다 동일한 것을 확인할 수 있습니다.

이런 경우 저는 제일 뒤페이지로 가곤 해요. 제일 앞/뒤를 확인하고 중간 부분을 확인하곤 합니다.

 

확인해보면 다음과 같이 확인할 수 있습니다

 

image

확인해보면, Malibu님께서 실행하신 쿼리는 pokemon_cnt가 0인 경우도 나오는 것을 확인할 수 있어요. 그 앞에 있는 파오리, 메리프, 캐터피는 동일한 결과가 나오지요.

 

2. 차이가 왜 났는가?

이걸 알기 위해선 JOIN이 어떻게 되는지 구체적인 데이터를 보면 좋습니다.

작성해주신 쿼리에서 캐터피는 pokemon_cnt가 0, 1인 캐터피와 파이리를 WHERE 조건에 걸어서 한번 보도록 해볼게요.

 

SELECT
  *
FROM basic.trainer_pokemon AS tp
LEFT JOIN basic.pokemon AS p
ON tp.pokemon_id = p.id
WHERE kor_name IN ("캐터피", "파이리")

 

쿼리 결과를 확인해보면 아래와 같이 나옵니다.

 

image

파이리의 경우 5개의 Row가 있으나 status가 모두 Released고, 캐터피는 Row가 1개 있으며 Active입니다. 그래서 조건을 설정할 때 파이리는 모두 Released라 Active, Training이 아니고 => 그래서 0이라고 COUNT가 된 것입니다.

 

trainer_pokemon 테이블(Left)엔 파이리가 존재하고, 이 테이블 우측에 pokemon 테이블을 붙였으니 JOIN한 결과에서 파이리가 존재하겠지요. 파이리가 존재하는데, COUNTIF 조건엔 맞지 않아 0이라고 나오게 되었습니다. 정답으로 공유드린 쿼리에선 trainer_pokemon에서 Active, Training만 WHERE 조건으로 걸었기 때문에 아예 파이리 데이터가 존재하지 않습니다.

 

지금 작성하신 쿼리에서 정답과 동일하게 하려면 HAVING pokemon_cnt >= 1 조건을 주면 됩니다.

 

SELECT
  p.kor_name,
  COUNTIF (tp.status IN ("Active", "Training")) AS pokemon_cnt
FROM basic.trainer_pokemon AS tp
LEFT JOIN basic.pokemon AS p
ON tp.pokemon_id = p.id
GROUP BY kor_name
HAVING pokemon_cnt >= 1
ORDER BY pokemon_cnt DESC

 

정리하면

  • JOIN할 때 미리 줄이지 않았기 때문에 의도와 다른 데이터가 나옴

  • 미리 줄이지 않았다면 쿼리의 결과 후에 꼭 확인하는 과정이 필요

  • 중간 중간 테이블을 확인하고, 쿼리 결과를 비교하면 무엇이 잘못되었는지 파악할 수 있음

 

또 궁금한 내용이 있으면 말씀해주셔요~!

Malibu님의 프로필 이미지
Malibu

작성한 질문수

질문하기