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

dbsdk4971님의 프로필 이미지
dbsdk4971

작성한 질문수

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

2-6. 연습 문제 13~17번

2-6 연습문제 16번. COUNT 함수 질문

해결된 질문

작성

·

204

0

안녕하세요,

2-6강을 수강하다가 연습문제 16번에 관한 질문이 있어 질문 드립니다.

 

16번을 풀이하실 때

 

SELECT

trainer_id,

COUNT(pokemon_id) AS pokemon_cnt

 

이렇게 쿼리를 시작하셨는데,

 

혼자 먼저 문제를 풀 때 저는

SELECT

trainer_id,

COUNT(status) AS pokemon_cnt

이렇게 쿼리를 작성하였습니다.

( COUNT( ) 안에 들어가는 부분에 pokemon_id 대신 status 컬럼을 사용)

 

이후 쿼리는 동일하게 작성을 하여 결과값은 똑같이 나왔는데

카일님께서 풀이하실 때 COUNT 함수에 pokemon_id 컬럼을 사용하신 이유가 무엇인지 조금 더 자세하게 설명해주실 수 있나요?

 

이렇게 COUNT 등 집계 함수를 사용할 때 어떤 컬럼을 사용해야 하는지 헷갈릴 때가 많습니다.

 

이런 경우 어떤 기준으로 판단하면 좋을까요?

 

좋은 강의 덕분에 항상 많이 배우고 있습니다. 감사합니다!

 

 

답변 2

2

dbsdk4971님의 프로필 이미지
dbsdk4971
질문자

COUNT 안에 status를 넣은 이유는

문제를 본격적으로 풀기 전, 이용할 컬럼을 생각할 때

'많이 풀어준' 이라는 조건에 집중하여

status 컬럼을 사용해야지 라는 생각에 집중하다보니

자연스럽게 COUNT 함수에 status를 넣었던 것 같습니다.

 

다시 풀어보며

카일님의 설명대로 어떤 것을 카운트하고 싶은가를 먼저 정확히 정의한 후 생각해보니, 왜 pokemon_id를 넣어야 하는지 이해가 되었습니다.

 

한가지 더 궁금한 점은,

포켓몬의 수를 알려면 pokemon_id가 유니크한 값이므로 이것을 카운트하셨다고 했는데,

pokemon_id 대신 id를 카운트하면 문제가 원하는 의도가 아닐까요?

(id도 중복되지 않는 고유한 값이니까요)

다른 문제에서 COUNT 함수를 사용할 때 대부분 id를 사용했다보니 이 궁금증이 생겼습니다.

 

추가로,

15번 문제(트레이너가 보유한 포켓몬이 가장 많은 트레이너는?)에서 DISTINCT를 사용하지 않는 이유에 대해서 설명해주신 후 다음 문제로 넘어가셔서

결론적으로 문제의 답은 설명해주지 않으신 것 같은데,

보유한 포켓몬이 13개로 trainer_id가 17인 트레이너가 정답이 맞을까요?

 

친절하고 자세한 설명 너무 감사드립니다.

카일님 답변을 통해 궁금하던 점의 생각이 많이 정리되었습니다.

 

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

오 말씀해주셔서 감사합니다! 이렇게 질문드린 이유는 현업에서도 이런 실수를 할 수 있어서 복기해두면 그 이후엔 실수할 가능성이 적어지더라구요. 조건과 COUNT할 때는 다르다!라고 생각하시면 될 것 같네요

 

pokemon_id 대신 id를 카운트하면 문제가 원하는 의도가 아닐까요? => trainer_pokemon의 id는 트레이너가 보유한 포켓몬의 수므로 해당 문제에선 그렇게 해도 괜찮을 수 있습니다. 저는 포켓몬의 종류와 수를 구해야 할 때를 둘 다 대비해서 pokemon_id를 사용했다고 보시면 될 것 같네요. id를 사용하면 같은 피카츄가 몇 번이였나? 라는 정보를 알 수 없을거니깐요. SQL 문제에서 정답이 하나가 아니라 관점에 따라서(또는 조건을 어떻게 걸었는지에 따라) 다를 수 있다고 이해하시면 될 것 같네요

 

아 15번의 경우 답은 trainer_id가 17인 트레이너가 맞습니다!! 영상에서 GROUP BY하고 ORDER BY를 안보여드렸었네요. 말씀 감사합니다!

끝까지 강의 모두 수강하시지요!! 🙂 응원합니다!

1

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

dbsdk4971님 안녕하세요!

16번 문제 잘 풀고 계시네요. 해당 문제에선 status를 넣어도 동일한 결과가 나올거에요. 그 이유는 하나의 pokemon_id에 값이 존재하면 status도 값이 존재하기 때문이에요.

COUNT 집계함수를 사용할 때 어떤 컬럼을 사용하는지는 "문제"를 어떻게 정의하냐에 따라 생각해볼 수 있어요. 16번 문제는 포켓몬을 많이 풀어준 트레이너는 누구일까요?가 문제였지요. 이것을 위해 알아야 하는 것은 트레이너가 몇 마리의 포켓몬을 풀어줬는지?를 알아야 합니다.

이럴 때 status를 COUNT하시면 포켓몬의 수를 COUNT했다기보단, trainer_id 별로 status의 Row 수를 COUNT했다고 볼 수 있지요. 이 문제에서 결과는 동일하지만, 나중에 JOIN을 배운 후에는 이 부분이 오답이 생길수도 있을 확률이 존재합니다.

어떤 경우에 이슈가 될까에 대해서는 다른 분이 질문하신 글을 보시면 이해가 되실 것 같네요

https://www.inflearn.com/questions/1209167/join-3%EB%B2%88-4%EB%B2%88-%EB%AC%B8%EC%A0%9C

 

포켓몬의 수를 알려면 pokemon_id가 id(유니크한 값)이므로 이 값을 COUNT하는게 좋습니다. 문제를 정의할 때 어떤 것을 COUNT하고 싶은가? 생각해보고 그 값에 대한 것을 COUNT을 합니다. 만약 포켓몬의 수가 아니라 고유한 포켓몬의 수를 알려달라고 했다면 status를 DISTINCT 할 경우엔 오답이 나올거에요. DISTINCT status를 하면 WHERE 조건에 Released를 걸어줬다면 Released만 나올거에요. DISTINCT pokemon_id를 하면 고유한 pokemon_id(예 : 1, 2, 25 등)이 나오겠지요.

저도 궁금한 내용은 왜 status를 COUNT 안에 넣으셨나요? 어떤 생각을 가지시면서 사용하셨을지 궁금하네요(맥락이 있으실 것 같아서) 이 부분 말씀해주시겠어요?

dbsdk4971님의 프로필 이미지
dbsdk4971

작성한 질문수

질문하기