해결된 질문
24.07.17 14:52 작성
·
70
답변 1
0
2024. 07. 17. 15:31
Malibu님 안녕하세요! 문제 잘 풀고 계시네요 💪
COUNTIF에서 status에 IN을 걸어서 풀어주셨네요.
이런 경우 결과 갯수가 차이가 있으면, 저는 아래와 같은 방법으로 해결합니다(바로 답을 공유드리는 것보다 제가 해당 질문을 보고 어떤 방식으로 확인했는지 공유드릴게요)
차이가 난 부분이 어디인지 알아내야 합니다. 이를 위해 쿼리문에서 pokemon_cnt DESC를 줬기 때문에 두개의 차이를 보기 편할거에요
BigQuery 콘솔에서 두개의 결과를 동시에 띄워서 보기도 하고, 결과를 JSON으로 추출해서 JSON_DIFF 도구를 사용해 비교해보곤 합니다(https://www.jsondiff.com/)
확인해보면 현재 166, 153(이건 제가 강의에서 공유한 쿼리를 사용한 결과)가 나오네요. 첫 페이지를 자세히 보면 버터풀 ~ 왕콘치까지 모두 다 동일한 것을 확인할 수 있습니다.
이런 경우 저는 제일 뒤페이지로 가곤 해요. 제일 앞/뒤를 확인하고 중간 부분을 확인하곤 합니다.
확인해보면 다음과 같이 확인할 수 있습니다
확인해보면, Malibu님께서 실행하신 쿼리는 pokemon_cnt가 0인 경우도 나오는 것을 확인할 수 있어요. 그 앞에 있는 파오리, 메리프, 캐터피는 동일한 결과가 나오지요.
이걸 알기 위해선 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할 때 미리 줄이지 않았기 때문에 의도와 다른 데이터가 나옴
미리 줄이지 않았다면 쿼리의 결과 후에 꼭 확인하는 과정이 필요
중간 중간 테이블을 확인하고, 쿼리 결과를 비교하면 무엇이 잘못되었는지 파악할 수 있음
또 궁금한 내용이 있으면 말씀해주셔요~!