테이블 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