[프로그래머스] 물고기 종류 별 대어 찾기

yannie·2024년 10월 17일
0

[문제]

물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.

물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.
결과는 물고기의 ID에 대해 오름차순 정렬해주세요.
단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.

[내가 푼 풀이(오답)]

SELECT
    I.ID, -- 가장 큰 물고기의 ID
    N.FISH_NAME, -- 물고기 이름
    I.LENGTH -- 길이
FROM FISH_INFO I
INNER JOIN FISH_NAME_INFO N
ON I.FISH_TYPE = N.FISH_TYPE
GROUP BY I.FISH_TYPE
HAVING MAX(I.LENGTH)
ORDER BY I.ID
;

-- 이 코드가 실행되지 않는 이유는 SELECT문에 FISH_TYPE컬럼이 없기 때문이다.
-- 
  • 이 코드가 아래와 같은 오류가 나는 이유는 :
    - SELECT문에 FISH_TYPE컬럼이 없기 때문이다.
    - GROUP BY 절에 포함되지 않거나 집계함수로 처리되지 않은 모든 컬럼이 명시적으로 그룹필 되어야 한다.

[내가 푼 풀이(정답)]

-- 물고기 종류 별 가장 큰 물고기
SELECT
    I.ID, -- 가장 큰 물고기의 ID
    N.FISH_NAME, -- 물고기 이름
    I.LENGTH -- 길이
FROM FISH_INFO I
INNER JOIN FISH_NAME_INFO N
ON I.FISH_TYPE = N.FISH_TYPE
WHERE I.LENGTH = (
    SELECT MAX(LENGTH)
    FROM FISH_INFO
    WHERE FISH_TYPE = I.FISH_TYPE)
ORDER BY I.ID
;

[코드리뷰]

  • FISH_TYPE별로 가장 큰 LENGTH를 가진 물고기의 정보를 가져오는 서브쿼리를 사용하였다.
  • 가장 큰 LENGTH를 반환하여 WHERE절에서 해당 값과 일치하는 행만 메인쿼리에서 반환하도록 만들었다.

기억해!

GROUP BY를 사용할 때,
SELECT절의 모든 열은 GROUP BY절에 포함되거나,
집계함수를 통해 명확하게 정의되어야 한다.
=> 그룹화되지 않거나 집계되지 않은 열을 SELECT절에 포함시키는 것은 허용되지 않는다.

0개의 댓글