몸과 마음이 건전한 SW 개발자

[SQL-GROUP BY] 프로그래머스 Lv. 2 물고기 종류 별 잡은 수 구하기 [다시 풀어 보기] 본문

SQL/다시 풀어 보기

[SQL-GROUP BY] 프로그래머스 Lv. 2 물고기 종류 별 잡은 수 구하기 [다시 풀어 보기]

스위태니 2024. 12. 19. 20:59

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/293257

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

틀린 코드

WITH FISH_COUNT_INFO AS (
    SELECT
        FNI.FISH_NAME,
        COUNT(FI.ID) AS FISH_COUNT
    FROM FISH_INFO FI
    GROUP BY FI.FISH_TYPE
    JOIN FISH_NAME_INFO FNI
    ON FI.FISH_TYPE = FNI.FISH_TYPE
)
SELECT FISH_NAME, FISH_COUNT
FROM FISH_COUNT_INFO
ORDER BY FISH_COUNT;

정답 코드

WITH FISH_COUNT_INFO AS (
    SELECT
        FNI.FISH_NAME,
        COUNT(*) AS FISH_COUNT
    FROM FISH_INFO FI
    JOIN FISH_NAME_INFO FNI
    ON FI.FISH_TYPE = FNI.FISH_TYPE
    GROUP BY FNI.FISH_NAME
)
SELECT FISH_COUNT, FISH_NAME
FROM FISH_COUNT_INFO
ORDER BY FISH_COUNT DESC;

풀이 과정

 

  1. JOIN:
    • FISH_INFO.FISH_TYPE와 FISH_NAME_INFO.FISH_TYPE를 기준으로 두 테이블을 결합한다.
    • 결과: 물고기 이름(FISH_NAME)과 관련된 물고기 ID 목록 생성.
  2. GROUP BY:
    • FNI.FISH_NAME을 기준으로 그룹화하여, 각 물고기의 이름별 잡힌 개수를 계산한다.
  3. 최종 SELECT 및 정렬:
    • FISH_NAME과 FISH_COUNT를 출력하고, 잡힌 수(FISH_COUNT)를 기준으로 내림차순 정렬한다.

1. FI.FISH_TYPE를 기준으로 그룹화하면 발생하는 문제

  • FI.FISH_TYPE 기준으로 그룹화할 경우, SELECT 절에서 그룹화되지 않은 컬럼(FNI.FISH_NAME)를 사용할 때 오류가 발생할 수 있다.

왜 문제가 되나?

  • FNI.FISH_NAME는 JOIN 이후에 생성된 컬럼이므로, SQL 표준에 따라 GROUP BY에 포함되거나, 집계 함수(COUNT, MAX, MIN 등)에 포함되어야 한다.
  • 그러나, FI.FISH_TYPE만 그룹화할 경우, FNI.FISH_NAME은 GROUP BY에 포함되지 않았기 때문에 SQL 엔진이 해당 값을 참조할 수 없다.

예제

SELECT 
    FNI.FISH_NAME,
    COUNT(FI.ID) AS FISH_COUNT
FROM FISH_INFO FI
JOIN FISH_NAME_INFO FNI
ON FI.FISH_TYPE = FNI.FISH_TYPE
GROUP BY FI.FISH_TYPE; -- 오류 발생
  • 오류 원인:
    • FNI.FISH_NAME은 GROUP BY FI.FISH_TYPE로 그룹화되지 않았으므로, SQL 엔진이 FNI.FISH_NAME을 결정할 수 없다.
    • 왜냐하면 하나의 FI.FISH_TYPE에 여러 개의 FNI.FISH_NAME이 존재할 수 있기 때문이다.

 

느낀점

  • 그룹화를 시킬 때 FISH_NAME을 보여주고 싶으면 FISH_NAME를 기준으로 그룹화를 시켜야 한다.