[프로그래머스] Lv.2 물고기 종류 별 잡은 수 구하기 (JOIN + GROUP BY)
[프로그래머스] Lv.2 물고기 종류 별 잡은 수 구하기 (JOIN + GROUP BY)
Apr 04, 2024




답
SELECT COUNT(N.FISH_TYPE) AS FISH_COUNT, N.FISH_NAME
FROM FISH_INFO AS F
INNER JOIN FISH_NAME_INFO AS N
ON F.FISH_TYPE = N.FISH_TYPE
GROUP BY N.FISH_TYPE, N.FISH_NAME
ORDER BY FISH_COUNT DESC
-- 또는
SELECT COUNT(N.FISH_TYPE) AS FISH_COUNT, MIN(N.FISH_NAME) AS FISH_NAME
FROM FISH_INFO AS F
INNER JOIN FISH_NAME_INFO AS N
ON F.FISH_TYPE = N.FISH_TYPE
GROUP BY N.FISH_TYPE
ORDER BY FISH_COUNT DESC
풀이
◽ JOIN 과 GROUP BY
GROUP BY는 같은 값을 가진 행끼리 하나의 그룹으로 뭉쳐주며, 주로
집계 함수
와 같이 사용된다. JOIN
으로 원하는 데이터를 1차로 SELECT 한다.
SELECT N.FISH_TYPE, N.FISH_NAME
FROM FISH_INFO AS F
INNER JOIN FISH_NAME_INFO AS N
ON F.FISH_TYPE = N.FISH_TYPE

- 물고기 종류 별 수를 구하기 위해 겹치는 데이터를
GROUP BY
로 합쳐COUNT 함수
를 통해 FISH_COUNT 데이터를 출력한다.
SELECT COUNT(N.FISH_TYPE) AS FISH_COUNT, MIN(N.FISH_NAME) AS FISH_NAME
GROUP BY N.FISH_TYPE
// FISH_NAME을 보면 FISH_TYPE에 맞는 동일한 데이터가 존재한다. 그래서 SELECT절에서 COUNT(FISH_TYPE)만을 한다면, 아래와 같은 오류가 날 것이기 때문에 MIN함수를 통해 FISH_NAME의 제일 처음 데이터(1개)를 출력하도록 한다.
SELECT COUNT(N.FISH_TYPE) AS FISH_COUNT, N.FISH_NAME
GROUP BY N.FISH_TYPE, N.FISH_NAME
// FISH_TYPE, FISH_NAME 둘 다 GROUP BY를 한다면, 이미 동일한 데이터를 합쳤기 때문에 SELECT절에서 MIN함수를 사용하지 않아도 FISH_NAME(1개)를 출력할 수 있다.
🚫 오류
"Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'programmers.N.FISH_NAME' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"
➡️ SQL.MODE가 ONLY_FULL_GROUP_BY로 설정되어 있어, GROUP BY에 지정된 열 이외의 열을 포함하려면 반드시 집계 함수를 사용해야 할 때 뜨는 오류이다.
Share article