5-6 1번 문제

안녕하세요. where에 조건을 걸기 전에 조인하고 한번 해봤는데 결과 갯수가 차이가 있습니다. 어떤 부분 때문에 이런 차이가 발생할까요?
답변 1
0
Malibu님 안녕하세요! 문제 잘 풀고 계시네요 💪
COUNTIF에서 status에 IN을 걸어서 풀어주셨네요.
이런 경우 결과 갯수가 차이가 있으면, 저는 아래와 같은 방법으로 해결합니다(바로 답을 공유드리는 것보다 제가 해당 질문을 보고 어떤 방식으로 확인했는지 공유드릴게요)
1. 어디서 차이가 났는가?
차이가 난 부분이 어디인지 알아내야 합니다. 이를 위해 쿼리문에서 pokemon_cnt DESC를 줬기 때문에 두개의 차이를 보기 편할거에요
BigQuery 콘솔에서 두개의 결과를 동시에 띄워서 보기도 하고, 결과를 JSON으로 추출해서 JSON_DIFF 도구를 사용해 비교해보곤 합니다(https://www.jsondiff.com/)

확인해보면 현재 166, 153(이건 제가 강의에서 공유한 쿼리를 사용한 결과)가 나오네요. 첫 페이지를 자세히 보면 버터풀 ~ 왕콘치까지 모두 다 동일한 것을 확인할 수 있습니다.
이런 경우 저는 제일 뒤페이지로 가곤 해요. 제일 앞/뒤를 확인하고 중간 부분을 확인하곤 합니다.
확인해보면 다음과 같이 확인할 수 있습니다

확인해보면, 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 ("캐터피", "파이리")
쿼리 결과를 확인해보면 아래와 같이 나옵니다.

파이리의 경우 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할 때 미리 줄이지 않았기 때문에 의도와 다른 데이터가 나옴
미리 줄이지 않았다면 쿼리의 결과 후에 꼭 확인하는 과정이 필요
중간 중간 테이블을 확인하고, 쿼리 결과를 비교하면 무엇이 잘못되었는지 파악할 수 있음
또 궁금한 내용이 있으면 말씀해주셔요~!
vs code
0
51
2
수업자료 다운
0
49
2
쿼리 화면 문의
0
72
2
4-5. 3번 문제 질
0
66
2
JOIN 1번 문제
1
76
2
battle 테이블 생성 시 생성 오류
0
69
1
5-6. 4번 문제 WHERE 조건의 위치 문의
0
65
2
5-6. 연습문제 4번, type2에 대해서는 고려하지 않아도 될까요?
1
71
2
battle table 오류
0
69
2
location IS NOT NULL 을 굳이 안 써도 되지 않나요?
0
62
2
12강 집계 함수
0
49
1
2-6. 연습 문제 1~3번
0
50
1
안녕하세요! 11번 문제 query문에 관해 질문드립니다
0
51
1
2-6 #2 WHERE vs. HAVING절 사용 여부 차이
0
67
1
섹션 별 퀴즈
0
67
1
espanso 설치 완료 후 프로그램 실행 문제
0
104
2
Syntax에러
0
83
2
4-5. 1번 문제 TIMESTAMP 관련 질문
0
89
2
시각화 도구 사용
0
110
2
11번 문제 GROUP BY 사용하는 이유
0
99
1
big query 쿼리 결과 컬럼 폭
0
108
3
battle 스키마 조건 복사 파일이 열리지 않아요.
0
130
1
6-5 데이터 검증 결과 예시문제
0
79
2
battle 스키마 조건 복사붙여넣기용 자료
0
115
2





