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

풀이
평균을 구하기 위해서는
FISH_TYPE
을 GROUP
으로 묶어서 MAX
함수를 이용하여 가장 큰 값을 구하고, COUNT
함수로 해당 FISH_TYPE
에 몇 개의 column
이 있는지 표시해주었다.SELECT count(*) FISH_COUNT, max(LENGTH) MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
group by FISH_TYPE
현재
FISH_INFO
에는 null
인 LENGTH
가 있는데 이것을 문제 조건에 맞게 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

Share article