해결된 질문
작성
·
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
COUNT 안에 status를 넣은 이유는
문제를 본격적으로 풀기 전, 이용할 컬럼을 생각할 때
'많이 풀어준' 이라는 조건에 집중하여
status 컬럼을 사용해야지 라는 생각에 집중하다보니
자연스럽게 COUNT 함수에 status를 넣었던 것 같습니다.
다시 풀어보며
카일님의 설명대로 어떤 것을 카운트하고 싶은가를 먼저 정확히 정의한 후 생각해보니, 왜 pokemon_id를 넣어야 하는지 이해가 되었습니다.
한가지 더 궁금한 점은,
포켓몬의 수를 알려면 pokemon_id가 유니크한 값이므로 이것을 카운트하셨다고 했는데,
pokemon_id 대신 id를 카운트하면 문제가 원하는 의도가 아닐까요?
(id도 중복되지 않는 고유한 값이니까요)
다른 문제에서 COUNT 함수를 사용할 때 대부분 id를 사용했다보니 이 궁금증이 생겼습니다.
추가로,
15번 문제(트레이너가 보유한 포켓몬이 가장 많은 트레이너는?)에서 DISTINCT를 사용하지 않는 이유에 대해서 설명해주신 후 다음 문제로 넘어가셔서
결론적으로 문제의 답은 설명해주지 않으신 것 같은데,
보유한 포켓몬이 13개로 trainer_id가 17인 트레이너가 정답이 맞을까요?
친절하고 자세한 설명 너무 감사드립니다.
카일님 답변을 통해 궁금하던 점의 생각이 많이 정리되었습니다.
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 안에 넣으셨나요? 어떤 생각을 가지시면서 사용하셨을지 궁금하네요(맥락이 있으실 것 같아서) 이 부분 말씀해주시겠어요?
오 말씀해주셔서 감사합니다! 이렇게 질문드린 이유는 현업에서도 이런 실수를 할 수 있어서 복기해두면 그 이후엔 실수할 가능성이 적어지더라구요. 조건과 COUNT할 때는 다르다!라고 생각하시면 될 것 같네요
pokemon_id 대신 id를 카운트하면 문제가 원하는 의도가 아닐까요? => trainer_pokemon의 id는 트레이너가 보유한 포켓몬의 수므로 해당 문제에선 그렇게 해도 괜찮을 수 있습니다. 저는 포켓몬의 종류와 수를 구해야 할 때를 둘 다 대비해서 pokemon_id를 사용했다고 보시면 될 것 같네요. id를 사용하면 같은 피카츄가 몇 번이였나? 라는 정보를 알 수 없을거니깐요. SQL 문제에서 정답이 하나가 아니라 관점에 따라서(또는 조건을 어떻게 걸었는지에 따라) 다를 수 있다고 이해하시면 될 것 같네요
아 15번의 경우 답은 trainer_id가 17인 트레이너가 맞습니다!! 영상에서 GROUP BY하고 ORDER BY를 안보여드렸었네요. 말씀 감사합니다!
끝까지 강의 모두 수강하시지요!! 🙂 응원합니다!