본문 바로가기
데이터 분석/SQL 연습문제

코테 연습 13일차 (프로그래머스 SQL 고득점 Kit)

2022. 2. 16.

My SQL / sublime

 

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

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

programmers.co.kr

문제: 동명 동물 수 찾기

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 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

본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.


풀이

두 번 이상 쓰인 이름과 횟수를 구하는데 실패했다. COUNT(*)가 2 이상이라는 조건을 걸고 싶었는데 집계함수에 조건을 적용하지 못하는건가?

제출한 오답

-- 코드를 입력하세요
SELECT NAME,COUNT(*)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
ORDER BY NAME ASC;

몰랐던 문법

FROM 절에 사용하는 서브쿼리 (=인라인 뷰)
SELECT ...FROM (서브쿼리) [AS] 이름...


서브쿼리는 SELECT 문의 FROM 절에서도 사용할 수 있습니다.
이때 서브쿼리에 의해 선택된 결과 집합은 FROM 절에서 하나의 테이블로써 사용됩니다.
 
SELECT 문의 FROM 절에서 사용되는 모든 테이블에는 이름이 필요합니다.
따라서 FROM 절에서 사용되는 서브쿼리는 위의 문법처럼 반드시 이름을 정의해야 합니다.

http://www.tcpschool.com/mysql/mysql_multipleTable_subquery

참고: 서브쿼리 종류

다시 제출한 답

-- 코드를 입력하세요
SELECT NAME,COUNT(*)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(*)>1
ORDER BY NAME ASC;

-> HAVING 절을 사용하니 내가 생각했던 대로 조건을 걸 수 있었다.

다른 답

SELECT NAME, COUNT
FROM(
    SELECT NAME, COUNT(NAME) AS COUNT
    FROM ANIMAL_INS
    GROUP BY NAME) A
WHERE COUNT > 1
ORDER BY NAME ASC;

-> 서브쿼리를 활용하는 방법. 대신 별칭을 반드시 지정해줘야 한다.

2022.02.16

댓글