본문 바로가기

Skill Sets/SQL

[SQL] 월별 잡은 물고기 수 구하기(프로그래머스/MySQL/Level 2)

SMALL


안녕하세요! 데코입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "월별 잡은 물고기 수 구하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/293260)


 

1. 문제 :  월별 잡은 물고기 수 구하기(Lv. 2)


 

2. 문제 설명

 

 

낚시앱에서 사용하는 FISH_INFO 테이블은 잡은 물고기들의 정보를 담고 있습니다.

FISH_INFO 테이블의 구조는 다음과 같으며

ID, FISH_TYPE, LENGTH, TIME은 각각

잡은 물고기의 ID, 물고기의 종류(숫자), 잡은 물고기의 길이(cm), 물고기를 잡은 날짜를 나타냅니다.

 

[ 테이블 구조('FISH_INFO') ]

COLUMN NAME TYPE NULLABLE
ID INTEGER FALSE
FISH_TYPE
INTEGER FALSE
LENGTH FLOAT TRUE
TIME DATE FALSE

 

 

단, 잡은 물고기의 길이가 10cm 이하일 경우에는 LENGTH 가 NULL이며,

LENGTH에 NULL 만 있는 경우는 없습니다.

FISH_NAME_INFO 테이블은 물고기의 이름에 대한 정보를 담고 있습니다.

FISH_NAME_INFO 테이블의 구조는 다음과 같으며,

FISH_TYPE, FISH_NAME 은 각각

물고기의 종류(숫자), 물고기의 이름(문자)입니다.

 

 

[ 문제 ]

월별 잡은 물고기의 수와 월을 출력하는 SQL문을 작성해주세요.

잡은 물고기 수 컬럼명은 FISH_COUNT, 월 컬럼명은 MONTH로 해주세요.
결과는 월을 기준으로 오름차순 정렬해주세요.
단, 월은 숫자형태 (1~12) 로 출력하며 9 이하의 숫자는 두 자리로 출력하지 않습니다. 잡은 물고기가 없는 월은 출력하지 않습니다.

 

[ 예시 ]

 

예를 들어 FISH_INFO 테이블이 다음과 같다면

ID FISH_TYPE LENGTH TIME
0 0 30 2021/12/04
1 0 50 2020/03/07
2 0 40 2020/03/07
3 1 20 2022/03/09
4 1 NULL 2022/04/08
5 2 13 2021/04/28
6 3 60 2021/04/28
7 0 55 2021/07/27
8 2 73 2020/01/18
9 3 73 2021/04/28
10 2 22 2020/06/28
11 2 17 2022/12/23

 

월별 잡은 물고기는 각각

1월에 2마리,

3월에 3마리,

4월에 3마리,

6월에 1마리,

7월에 1마리,

12월에 2마리이고,

잡은 물고기가 없는 월은 출력하지 않으므로, 월에 대해 오름차순 정렬하면 결과는 다음과 같습니다.

 

[ 출력 결과 ]

FISH_COUNT MONTH
2 1
3 3
3 4
1 6
1 7
2 12

 

 


 

3. 문제 풀이

-- 1안
SELECT  COUNT(ID) AS FISH_COUNT
        , MONTH(TIME) AS MONTH
  FROM  FISH_INFO
 GROUP
    BY  MONTH(TIME)
 ORDER
    BY  MONTH ASC

 

 

이번 문제는 총 1안 한 가지로 작성했습니다!

 

#  1안 풀이 설명

# [ 문제 접근 설명 ]


문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이  두 가지 단계로 진행했어요!

1. FISH_INFO 테이블에서 월별 잡은 횟수 구하기(GROUP BY)

2. 월(MONTH) 기준으로 내림차순 정렬(ORDER BY)

 

# [ 1안 쿼리 작성 설명 ]

 

 1  첫 번째 단계에서는 FISH_INFO 테이블에서 월별 잡은 물고기 수를 구하는 쿼리를 작성했습니다!

 

GROUP BY를 이용하여 산출하였고, 출력결과와 동일하도록

 

잡은 물고기의 수는 FISH_COUNT로 별칭을 칭해주고, 월은 MONTH로 별칭을 칭해주었습니다!

 

일반적으로는 GROUP BY에 이용한 컬럼을 SELECT 맨 앞에 적어주지만

 

문제에서 요구하는 것과 같이 FISH_COUNT, MONTH 순으로 SELECT 문에 적어주었습니다.

(ORACLE에서는 이렇게 작성하면 오류가 났던 기억이네요)

 


SELECT  COUNT(ID) AS FISH_COUNT
                 ,  MONTH(TIME) AS MONTH
   FROM   FISH_INFO
 GROUP
         BY   MONTH(TIME)

 

 

 2  두 번째 단계에서는 요구사항에 맞게 정렬했어요!

월(MONTH) 기준 오름차순으로 정렬했습니다!

 


SELECT  COUNT(ID) AS FISH_COUNT
                 ,  MONTH(TIME) AS MONTH
   FROM   FISH_INFO
 GROUP
         BY   MONTH(TIME)

 ORDER
         BY  MONTH  ASC

 

 

정답...!


 

4. 데코의 문제 풀이 후기

 

이번 문제는 저번에 다른 물고기 종류별 잡은 횟수 문제보다 더 쉬운 문제 같네요!

 

GROUP BY와 함께 COUNT() 함수를 통해 월별 잡은 물고기 수를 추출했습니다!

 

어려운 문제는 아니지만,

 

이 문제에서 언급하고 싶었던 부분은 두 가지입니다.

 

MySQL에서 GROUP BY에 쓰인 컬럼을 무조건 맨 앞에 적을 필요는 없다는 부분과

 

GROUP BY문 안에 쓰이는 컬럼은 MONTH(), YEAR()과 같은 함수로 산출한 값을 넣어도 된다는 부분입니다!

 

이번 문제와 유사하게 날짜 함수로 계산하여 집계하는 건 실생활에서도 정말 많이 이용하는 것 같아요!

 

혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요! 

 




설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

 

 

LIST