본문 바로가기
연습장/SQL

[프로그래머스] Lv3. 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (MySQL)

by Ruas 2024. 8. 15.
728x90

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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

 

 

1. CASE 구문 활용

 

CASE 구문을 활용하는 경우, HAVING 절에서 활용한다.

특정 값을 변경하여 출력하는 경우가 아니기 때문에 SELECT 문에 적용하지 않는다.

 

물고기의 길이 값이 NULL 이거나 10cm 이하인 경우, 이를 모두 10cm로 정의해야 하기 때문에 다음과 같이 코드를 작성한다.

 

HAVING AVG(CASE WHEN LENGTH <= 10 OR LENGTH IS NULL THEN 10
		   ELSE LENGTH
           END) >= 33

 

이렇게 하면 변환된 데이터의 평균 값이 33 이하인 경우에는 조건에 해당하지 않아 결과가 출력되지 않는다.

 

전체코드

더보기
SELECT COUNT(*) AS FISH_COUNT, MAX(LENGTH) AS MAX_LENGTH, FISH_TYPE
FROM FISH_INFO
GROUP BY FISH_TYPE
HAVING AVG(CASE WHEN LENGTH <= 10 OR LENGTH IS NULL THEN 10
		   ELSE LENGTH
           END) >= 33
ORDER BY FISH_TYPE

 

2. WITH절 활용

 

CASE 구문을 활용하는 경우 보다 간단하게 코드를 구현할 수 있으나 HAVING 이후에 오는 코드의 가독성이 조금 떨어진다.

이런 경우 WITH절을 사용하여 데이터를 사전에 정의하여 가독성에 유리하게 코드를 작성할 수 있다.(개인적)

 

WITH LENGTH_DATA AS (
SELECT ID, FISH_TYPE, LENGTH,
    CASE WHEN LENGTH <= 10 OR LENGTH IS NULL THEN 10
    ELSE LENGTH
    END AS LENGTH_OVER
FROM FISH_INFO
)

 

 

첫 번째로, LENGTH_DATA라는 CTE를 생성하여 문제에서 제시하는 데이터를 입력한다.

WITH절 내부에 CASE 구문을 사용하여 10cm 미만이거나 NULL 값을 가지는 경우를 예외처리 했으며, 이 데이터를 LENGTH_OVER에 저장한다.

 

SELECT COUNT(ID) AS FISH_COUNT, MAX(LENGTH) AS MAX_LENGTH, FISH_TYPE FROM LENGTH_DATA
GROUP BY FISH_TYPE
HAVING AVG(LENGTH_OVER) >= 33
ORDER BY FISH_TYPE

 

이후 CTE에 저장된 데이터를 활용하여 AVG 값이 33 이상인 데이터를 탐색한다.

 

전체코드

더보기
WITH LENGTH_DATA AS (
SELECT ID, FISH_TYPE, LENGTH,
    CASE WHEN LENGTH <= 10 OR LENGTH IS NULL THEN 10
    ELSE LENGTH
    END AS LENGTH_OVER
FROM FISH_INFO
)

SELECT COUNT(ID) AS FISH_COUNT, MAX(LENGTH) AS MAX_LENGTH, FISH_TYPE FROM LENGTH_DATA
GROUP BY FISH_TYPE
HAVING AVG(LENGTH_OVER) >= 33
ORDER BY FISH_TYPE

 

728x90

댓글