해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 JOIN과 서브쿼리를 이용하여 푸는 문제로 초보자가 하기에는 보통정도의 난이도를 가지고 있습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
물고기 종류 별로 가장 큰 물고기의 ID, 물고기 이름, 길이를 출력하는 SQL 문을 작성해주세요.
물고기의 ID 컬럼명은 ID, 이름 컬럼명은 FISH_NAME, 길이 컬럼명은 LENGTH로 해주세요.결과는 물고기의 ID에 대해 오름차순 정렬해주세요.단, 물고기 종류별 가장 큰 물고기는 1마리만 있으며 10cm 이하의 물고기가 가장 큰 경우는 없습니다.
해당 문제에서 우선적으로 가져와야 할 것은 물고기 종류 별로의 가장 긴 길이를 찾아야 합니다. 그래서 저는 처음에 GROUP BY를 사용하여 물고기 종류 별로 묶고 그 중 제일 큰 길이의 물고기를 가져오려 했으나 문제가 있었습니다.
SELECT i.ID
, n.FISH_NAME
, MAX(i.LENGTH)
FROM FISH_INFO i
JOIN
FISH_NAME_INFO n ON i.FISH_TYPE = n.FISH_TYPE
GROUP BY n.FISH_NAME
ORDER BY ID
# 오류 내용
실패 (1055, "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'programmers.i.ID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")
- SQL에서는 GROUP BY에 포함되지 않은 모든 열은 집계 함수와 함께 사용되거나, GROUP BY 절에 포함되어야 합니다. 즉, GROUP BY 절에 포함되지 않은 열을 집계함수 없이 SELECT에 사용하려고 할 때 문제가 발생합니다.
즉 위의 코드로 한다면 i.ID는 집계함수 없이 사용하여 문제가 발생하게 된 것입니다. 물론 ID에 관련된 절을 빼주면 작동이 되긴 합니다!! 그래서 저는 ID 없이 해당 쿼리를 짜고 그 서브 쿼리의 결과와 같은 ID를 가져오도록 문제를 풀어보겠습니다.
1. JOIN으로 해당 타입의 물고기 이름 알아내기
SELECT ID
, FISH_NAME
, LENGTH
FROM FISH_INFO i
JOIN
FISH_NAME_INFO n ON i.FISH_TYPE = n.FISH_TYPE
이렇게 ID, 해당 타입의 물고기 이름과, 길이가 출력되는 것을 확인 할 수 있습니다.
2. 해당하는 타입의 가장 큰 길이 가져오기(서브 쿼리)
SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE
해당 코드는 가장 큰 길이를 가져오는 대신에 조건이 붙습니다. FISH_TYPE으로 묶고 해당 FISH_TYPE의 최대 길이를 가져와줍니다.
3. 서브 쿼리 적용하기
SELECT ID
, FISH_NAME
, LENGTH
FROM FISH_INFO I
JOIN
FISH_NAME_INFO N ON I.FISH_TYPE = N.FISH_TYPE
WHERE (I.FISH_TYPE, LENGTH) IN (SELECT FISH_TYPE, MAX(LENGTH)
FROM FISH_INFO
GROUP BY FISH_TYPE)
ORDER BY ID
이제 최종적으로 IN을 사용하여 해당 타입과 LENGTH가 있는 값 만 가져와주도록 WHERE절에 해당 서브쿼리를 넣어 주게 되면 저희가 원하는 결과값을 가져올 수 있게 됩니다.
자세히 WHERE절에 대해 말하자면 WHERE 절의 (I.FISH_TYPE, LENGTH)는 서브 쿼리의 결과값인 (1, 73)과 같은 값만 가져오도록 명령하는 것입니다. 그렇게 되면 자연스레 그 행에 있을테니 ID도 있을 테니 가져올 수 있는 것이구요!
그리고 모든 조건이 만족 되었고 마지막으로 정렬을 해주면 해당 코드는 정답이 됩니다!
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기 (자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기) (0) | 2024.10.30 |
---|---|
[SQL] Programmers 문제 풀기 (대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기) (0) | 2024.10.29 |
[SQL] Programmers 문제 풀기 (연도별 대장균 크기의 편차 구하기) (0) | 2024.10.25 |
[SQL] HackerRank 문제 풀기 (Symmetric Pairs) (0) | 2024.10.15 |
[SQL] SELF JOIN 사용하여 문제 풀기 (Rising Temperature) (0) | 2024.10.14 |