안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "월별 잡은 물고기 수 구하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : 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()과 같은 함수로 산출한 값을 넣어도 된다는 부분입니다!
이번 문제와 유사하게 날짜 함수로 계산하여 집계하는 건 실생활에서도 정말 많이 이용하는 것 같아요!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 가장 큰 물고기 10마리 구하기(프로그래머스/MySQL/Level 1) (36) | 2024.06.22 |
---|---|
[SQL] 물고기 종류별 대어 찾기(프로그래머스/MySQL/Level 3) (41) | 2024.06.09 |
[SQL] 물고기 종류 별 잡은 수 구하기(프로그래머스/MySQL/Level 2) (33) | 2024.05.26 |
[SQL] 식품분류별 가장 비싼 식품의 정보 조회하기(프로그래머스/MySQL/Level 4) (49) | 2024.04.06 |
[SQL] 조건별로 분류하여 주문상태 출력하기(프로그래머스/MySQL/Level 3) (59) | 2024.02.03 |