[코딩테스트] 35. 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기

편준민's avatar
Apr 23, 2025
[코딩테스트] 35. 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기

테이블 index

📌

FISH_INFO 

Column name
Type
Nullable
ID
INTEGER
FALSE
FISH_TYPE
INTEGER
FALSE
LENGTH
FLOAT
TRUE
TIME
DATE
FALSE

문제

💡
FISH_INFO에서 평균 길이가 33cm 이상인 물고기들을 종류별로 분류하여 잡은 수, 최대 길이, 물고기의 종류를 출력하는 SQL문을 작성해주세요. 결과는 물고기 종류에 대해 오름차순으로 정렬해주시고, 10cm이하의 물고기들은 10cm로 취급하여 평균 길이를 구해주세요.
컬럼명은 물고기의 종류 'FISH_TYPE', 잡은 수 'FISH_COUNT', 최대 길이 'MAX_LENGTH'로 해주세요.

예시

notion image

풀이

평균을 구하기 위해서는 FISH_TYPEGROUP으로 묶어서 MAX함수를 이용하여 가장 큰 값을 구하고, COUNT함수로 해당 FISH_TYPE에 몇 개의 column이 있는지 표시해주었다.
SELECT count(*) FISH_COUNT, max(LENGTH) MAX_LENGTH, FISH_TYPE FROM FISH_INFO group by FISH_TYPE
현재 FISH_INFO에는 nullLENGTH가 있는데 이것을 문제 조건에 맞게 10이하면 10으로 취급하고 그것도 포함하여 평균을 낸다.
SELECT count(*) FISH_COUNT, max(LENGTH) MAX_LENGTH, FISH_TYPE FROM FISH_INFO where avg(IFNULL(LENGTH, 10) >= 33) group by FISH_TYPE
처음에 where 절을 사용하면 되지 않을까 싶었는데, avg함수는 group으로 묶은 후에 사용이 가능했다. 하지만 sql query 실행 순서 상 where이 먼저 실행 되기때문에 where절에 avg함수를 사용하게 되면 무엇을 묶어서 평균을 내야할지 모르기 때문에 오류가 난다. 해결 방법은 group by 후 실행 되는 having을 사용하면된다
SELECT count(*) FISH_COUNT, max(LENGTH) MAX_LENGTH, FISH_TYPE FROM FISH_INFO group by FISH_TYPE having avg(IFNULL(LENGTH, 10) >= 33) ;
그 후에 잘 Query가 실행되는 것을 확인 후 order by 를 이용하여 정렬을 해주었다
SELECT count(*) FISH_COUNT, max(LENGTH) MAX_LENGTH, FISH_TYPE FROM FISH_INFO group by FISH_TYPE having avg(IFNULL(LENGTH, 10) >= 33) order by FISH_TYPE
이후 채점을 하였을 때 실패가 나오길래 무슨 문제일까 생각해보았는데, 현재는 null인 경우만 10으로 취급을 하였고 문제에서는 10이하여도 10으로 취급하라고 하였기 때문에 그 조건을 처리하지 않아서 실패가 나왔다. GREATEST를 사용하여 10이하이며. null인 값은 모두 10으로 취급하는 조건을 만들었다.
SELECT count(*) FISH_COUNT, max(LENGTH) MAX_LENGTH, FISH_TYPE FROM FISH_INFO group by FISH_TYPE HAVING AVG(GREATEST(IFNULL(LENGTH, 10), 10)) >= 33 order by FISH_TYPE
notion image
 
 
 
Share article

YunSeolAn