문제 설명
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 문을 작성해주세요.
이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
A562649 | Dog | 2014-03-20 18:06:00 | Sick | NULL | Spayed Female |
A412626 | Dog | 2016-03-13 11:17:00 | Normal | *Sam | Neutered Male |
A563492 | Dog | 2014-10-24 14:45:00 | Normal | *Sam | Neutered Male |
A513956 | Dog | 2017-06-14 11:54:00 | Normal | *Sweetie | Spayed Female |
보호소에 들어온 동물의 이름은 NULL(없음), *Sam, *Sam, *Sweetie입니다.
ㅠ이 중 NULL과 중복되는 이름을 고려하면, 보호소에 들어온 동물 이름의 수는 2입니다.
따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
count |
2 |
※ 컬럼 이름(위 예제에서는 count)은 일치하지 않아도 됩니다.
작성코드
나는 두가지 방법으로 풀어보았다.
1. 첫번째 방법
내가 처음으로 풀어본 방법인데 인라인뷰를 사용하여 서브쿼리로 작성한 코드이다.
먼저 distinct()함수로 name컬럼의 중복을 제거하고
이 값들의 name컬럼의 수를 카운트 하였다.
(여기서 count(컬럼명)을 하게되면 널값을 알아서 제거해주기 때문!)
나는 앞서 풀었던 '상위n개 레코드 구하기'문제에서 서브쿼리를 사용하였기에
다시한번 활용해 보았지만 이거보다 쉽게 풀 수 있는 방법이 있기에 다른 방법으로도 풀어보았다.
2. 두번째 방법
애초에 select할때 count함수 안에서 distinct로 name에 중복제거를 해준다.
그리고 name이 null이 아닐때라는 조건을 걸어준다.
사실 처음엔 count()함수 안에서 distinct를 사용할 수 있을 줄 몰랐다.
예전에 배웠겠지만 까먹은게 분명하다.
다른사람이 풀어본 코드를 찾아보니 이런식으로들 많이 풀었길래
괜히 어렵게 꼬아서 풀이한 내가 너무 한심하게 느껴졌다.;;
나름 오라클은 재밌어하고 많이 알고있다고 생각했지만
역시 시간이 지나니 잊혀지게 되나보다.
이런 기본적인 문제는 눈감고도 1초만에 풀수있도록 많이 연습해야겠다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 약수의 개수와 덧셈 (java) (0) | 2021.08.28 |
---|---|
[프로그래머스][SQL] 동물 수 구하기 (0) | 2021.08.22 |
[프로그래머스][SQL] 최솟값 구하기 (0) | 2021.08.22 |
[프로그래머스][SQL] 최댓값 구하기 (0) | 2021.08.22 |
[프로그래머스][SQL] NULL값 처리하기 (0) | 2021.08.22 |