안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "물고기 종류 별 잡은 수 구하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/293257)
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 은 각각
물고기의 종류(숫자), 물고기의 이름(문자)입니다.
[ 테이블 구조('FISH_NAME_INFO') ]
COLUMN NAME | TYPE | NULLABLE |
FISH_TYPE | INTEGER | FALSE |
FISH_NAME |
VARCHAR | FALSE |
[ 문제 ]
FISH_NAME_INFO에서 물고기의 종류 별 물고기의 이름과 잡은 수를 출력하는 SQL문을 작성해주세요.
물고기의 이름 컬럼명은 FISH_NAME, 잡은 수 컬럼명은 FISH_COUNT로 해주세요.
결과는 잡은 수 기준으로 내림차순 정렬해주세요.
[ 예시 ]
예를 들어 FISH_INFO 테이블이 다음과 같고
ID | FISH_TYPE | LENGTH | TIME |
0 | 0 | 13.37 | 2021/12/04 |
1 | 0 | 50 | 2020/03/07 |
2 | 0 | 40 | 2020/03/07 |
3 | 1 | 43.33 | 2020/03/09 |
4 | 1 | NULL | 2020/04/08 |
5 | 2 | 32 | 2020/04/28 |
FISH_NAME_INFO 테이블이 다음과 같고
FISH_TYPE | FISH_NAME |
0 | BASS |
1 | SNAPPER |
2 | ANCHOVY |
종류가 0인 물고기는 3마리, 1인 물고기는 2마리, 2인 물고기는 1마리를 잡았으며,
각각 이름이 'BASS', 'SNAPPER', 'ANCHOVY' 입니다.
따라서 잡은 수를 기준으로 내림차순 정렬하면 결과는 다음과 같습니다.
SQL을 실행하면 다음과 같이 출력되어야 합니다.
[ 출력 결과 ]
FISH_COUNT | FISH_NAME |
3 | BASS |
2 | SNAPPER |
1 | ANCHOVY |
3. 문제 풀이
-- 1안
SELECT AA.FISH_COUNT
, BB.FISH_NAME
FROM (
SELECT FISH_TYPE
, COUNT(*) AS FISH_COUNT
FROM FISH_INFO A
GROUP
BY FISH_TYPE
) AA
LEFT
JOIN FISH_NAME_INFO BB
ON AA.FISH_TYPE = BB.FISH_TYPE
ORDER
BY AA.FISH_COUNT DESC
이번 문제는 총 1안 한 가지로 작성했습니다!
# 1안 풀이 설명
# [ 문제 접근 설명 ]
문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이 세 가지 단계로 진행했어요!
1. FISH_INFO 테이블에서 물고기 종류별 잡은 횟수 구하기(GROUP BY)
2. FISH_NAME_INFO 테이블에서 1번에서 추출한 정보 결합(JOIN)
4. FISH_COUNT으로 내림차순 정렬(ORDER BY)
# [ 1안 쿼리 작성 설명 ]
1 첫 번째 단계에서는 FISH_INFO 테이블에서 물고기 종류별 잡은 수를 쿼리를 작성했습니다!
GROUP BY를 이용하여 산출하였고, 출력결과와 동일하게 FISH_COUNT로 별칭을 칭해주었습니다!
SELECT FISH_TYPE
, COUNT(*) AS FISH_COUNT
FROM FISH_INFO A
GROUP
BY FISH_TYPE
2 두 번째 단계에서는 FISH_NAME_INFO 테이블과 첫 번째 단계에서 생성한 쿼리를 JOIN 해 주었어요!
첫 번째 단계에서 생성한 쿼리를 서브쿼리로 넣은 후 JOIN을 했습니다!
SELECT AA.FISH_COUNT
, BB.FISH_NAME
FROM (
SELECT FISH_TYPE
, COUNT(*) AS FISH_COUNT
FROM FISH_INFO A
GROUP
BY FISH_TYPE
) AA
LEFT
JOIN FISH_NAME_INFO BB
ON AA.FISH_TYPE = BB.FISH_TYPE
3 세 번째 단계에서는 요구사항에 맞게 정렬했어요!
잡은 횟수(FISH_COUNT) 기준 내림차순으로 정렬했습니다!
SELECT AA.FISH_COUNT
, BB.FISH_NAME
FROM (
SELECT FISH_TYPE
, COUNT(*) AS FISH_COUNT
FROM FISH_INFO A
GROUP
BY FISH_TYPE
) AA
LEFT
JOIN FISH_NAME_INFO BB
ON AA.FISH_TYPE = BB.FISH_TYPE
ORDER
BY AA.FISH_COUNT DESC
4. 데코의 문제 풀이 후기
이번 문제에는 서브쿼리에서 GROUP BY와 함께 COUNT() 함수를 통해
물고기 종류 별 잡은 횟수를 추출하고
LEFT JOIN을 통해 물고기 NAME 정보들을 붙이고 원하는 정보만을 추출했습니다!
사실 ORDER BY를 서브쿼리 안에 넣어도 되는데, 서브쿼리 안 보다는 밖에서 걸어줘서
필요시에는 아래 정렬 조건만 바꾸는 게 코드 재사용 측면에서도 좋지 않을까 해서 이렇게 작성해 보았어요!
이 외에는 이전 문제들에서 모두 다룬 것들을 이용해서
따로 코멘트할 것은 없네요!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 물고기 종류별 대어 찾기(프로그래머스/MySQL/Level 3) (41) | 2024.06.09 |
---|---|
[SQL] 월별 잡은 물고기 수 구하기(프로그래머스/MySQL/Level 2) (31) | 2024.06.03 |
[SQL] 식품분류별 가장 비싼 식품의 정보 조회하기(프로그래머스/MySQL/Level 4) (49) | 2024.04.06 |
[SQL] 조건별로 분류하여 주문상태 출력하기(프로그래머스/MySQL/Level 3) (59) | 2024.02.03 |
[SQL] 5월 식품들의 총매출 조회하기(프로그래머스/MySQL/Level 4) (51) | 2024.01.29 |