SQL/프로그래머스

[프로그래머스/SQL] 동명 동물 수 찾기(MySQL)

류진주 2021. 10. 28. 17:11

https://programmers.co.kr/learn/courses/30/lessons/59041

 

코딩테스트 연습 - 동명 동물 수 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

예시

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

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A396810 Dog 2016-08-22 16:13:00 Injured Raven Spayed Female
A377750 Dog 2017-10-25 17:17:00 Normal Lucy Spayed Female
A355688 Dog 2014-01-26 13:48:00 Normal Shadow Neutered Male
A399421 Dog 2015-08-25 14:08:00 Normal Lucy Spayed Female
A400680 Dog 2017-06-17 13:29:00 Normal Lucy Spayed Female
A410668 Cat 2015-11-19 13:41:00 Normal Raven Spayed Female
  • Raven 이름은 2번 쓰였습니다.
  • Lucy 이름은 3번 쓰였습니다
  • Shadow 이름은 1번 쓰였습니다.

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

NAME COUNT
Lucy 3
Raven 2

[풀이]

ANIMAL_INS 테이블에서 값을 조회할 것이므로 FROM절에는 ANIMAL_INS를 작성한다.

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하기 위해서는 우선 조회할 항목인 동물 이름, 해당 이름이 쓰인 횟수를 SELECT절에 작성해주어야 한다. 횟수는 COUNT를 이용하여 작성해야 한다.

그러므로 SELECT NAME, COUNT(*) AS COUNT를 작성한다.

이때 결과는 이름이 없는 동물은 집계에서 제외해야하므로 WHERE절에 이름이 NULL인 동물은 제외하는 것을 의미하는 NAME IS NOT NULL을 작성한다.

위에서 COUNT하는 것은 이름이 사용된 횟수를 기준으로 집계해야한다. 그러므로 GROUP BY절에는 NAME을 작성한다.

조회되는 동물 이름 중 조회하는 조건은 동물 이름이 두 번 잇아 쓰여야 한다는 것이다. 그러므로 HAVING절에 COUNT(*)>=2를 작성한다. COUNT(*)은 NULL이 아닌 NAME별로 GROUPING되어 해당 이름이 몇 번 사용되었는지 그 횟수가 나타난다. 그러므로 HAVING COUNT(*)>=2를 이용해 각 이름 별로 사용 횟수가 2회 이상인 값들만 조회할 수 있도록 한다.

마지막으로 결과는 이름 순으로 조회해야하므로 ORDER BY절에 NAME을 작성한다.

 

[코드]

SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(*)>=2
ORDER BY NAME