inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

327

dbsdk4971

작성한 질문수 1

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 등 집계 함수를 사용할 때 어떤 컬럼을 사용해야 하는지 헷갈릴 때가 많습니다.

 

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

 

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

 

 

sql bigquery 데이터-리터러시

답변 2

2

dbsdk4971

COUNT 안에 status를 넣은 이유는

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

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

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

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

 

다시 풀어보며

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

 

한가지 더 궁금한 점은,

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

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

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

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

 

추가로,

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

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

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

 

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

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

 

3

카일스쿨

오 말씀해주셔서 감사합니다! 이렇게 질문드린 이유는 현업에서도 이런 실수를 할 수 있어서 복기해두면 그 이후엔 실수할 가능성이 적어지더라구요. 조건과 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 안에 넣으셨나요? 어떤 생각을 가지시면서 사용하셨을지 궁금하네요(맥락이 있으실 것 같아서) 이 부분 말씀해주시겠어요?

vs code

0

48

2

수업자료 다운

0

46

2

쿼리 화면 문의

0

70

2

4-5. 3번 문제 질

0

64

2

JOIN 1번 문제

1

73

2

battle 테이블 생성 시 생성 오류

0

68

1

5-6. 4번 문제 WHERE 조건의 위치 문의

0

64

2

5-6. 연습문제 4번, type2에 대해서는 고려하지 않아도 될까요?

1

68

2

battle table 오류

0

68

2

location IS NOT NULL 을 굳이 안 써도 되지 않나요?

0

61

2

12강 집계 함수

0

48

1

2-6. 연습 문제 1~3번

0

49

1

안녕하세요! 11번 문제 query문에 관해 질문드립니다

0

49

1

2-6 #2 WHERE vs. HAVING절 사용 여부 차이

0

65

1

섹션 별 퀴즈

0

64

1

espanso 설치 완료 후 프로그램 실행 문제

0

102

2

Syntax에러

0

81

2

4-5. 1번 문제 TIMESTAMP 관련 질문

0

87

2

시각화 도구 사용

0

109

2

11번 문제 GROUP BY 사용하는 이유

0

98

1

big query 쿼리 결과 컬럼 폭

0

107

3

battle 스키마 조건 복사 파일이 열리지 않아요.

0

128

1

6-5 데이터 검증 결과 예시문제

0

78

2

battle 스키마 조건 복사붙여넣기용 자료

0

113

2