• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

4번 문제 group by 질문

23.10.15 00:46 작성 조회수 153

0

select h.hacker_id, h.name from Submissions s

inner join Hackers h on s.hacker_id = h.hacker_id

inner join Challenges c on s.challenge_id = c.challenge_id

inner join Difficulty d on c.difficulty_level = d.difficulty_level

where d.score = s.score

group by h.hacker_id having count(h.hacker_id) > 1

order by count(h.hacker_id) desc, h.hacker_id

 

제가 푼 답안인데 틀렸다고 나옵니다.

 

 

group by h.hacker_id, h.name 2개를 해줘야 정답으로 나오는데 hacker_id만 그룹화 해서 묶어도 되는거 아닌가요? select 에 h.hacker_id, h.name 이 두개의 컬럼을 다 group으로 묶어줘야 되는 이유가 있나요? 이해가 되지 않습니다.

답변 2

·

답변을 작성해보세요.

1

SELECT 절에는 GROUP BY 기준이 되는 컬럼과 집계 함수로 선택된 컬럼만 포함되어야 합니다. 만약 집계되지 않은 컬럼(여기서는 h.name)이 SELECT에 포함되었는데, 이 컬럼이 GROUP BY에도 없다면 쿼리가 올바르게 동작하지 않을 수 있습니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.17

안녕하세요, 인프런 AI 인턴이에요.

SQL에서 GROUP BY 구문은 결과를 그룹화하고 집계 함수(예: COUNT, SUM, AVG 등)와 함께 사용할 때 주로 활용됩니다. GROUP BY 절에는 결과를 그룹화할 열을 지정해야 합니다.

이 경우에는 h.hacker_id 열을 GROUP BY 절에 포함시켰을 때도 작동하지만, h.name 열을 추가하여 h.hacker_id와 h.name을 함께 그룹화해야 정확한 결과가 나옵니다. 그룹화되지 않은 열은 집계 함수를 사용할 때 컴퓨터가 어떤 값을 선택해야 할지 알 수 없기 때문입니다. 따라서 h.hacker_id와 h.name 열 모두를 GROUP BY 절에 포함시키는 것이 좋습니다.

그리고, COUNT(h.hacker_id)는 해당 그룹 내의 h.hacker_id 값들의 개수를 세는 것입니다. 위의 쿼리는 count(h.hacker_id)가 1보다 큰 그룹들을 선택하고, 이를 그룹 내에서 개수가 큰 순으로 정렬하는 것입니다.

즉, h.hacker_id와 h.name을 함께 그룹화한 이유는 각 그룹 내의 h.hacker_id와 h.name의 개수가 1보다 큰 그룹들을 선택하고, 이를 개수가 큰 순으로 정렬하기 위해서입니다.

그룹화된 열을 SELECT 절에 모두 나열하지 않더라도, GROUP BY 절에 포함된 열을 SELECT 절에 포함시켜야 합니다. 따라서 SELECT 절에 h.hacker_id와 h.name을 모두 나열해주셔야 합니다.

자세한 내용은 SQL 문법과 GROUP BY 구문에 대해 더 공부하시면 좋을 것 같아요. 추가 질문이 있으시면 언제든지 해주세요. 좋은 결과 있기를 바라요!