중복 제거하기

2022. 11. 20. 15:01SQL 문제

문제 설명

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

NAMETYPENULLABLE
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_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_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)은 일치하지 않아도 됩니다.

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/59408

정답
SELECT DISTINCT COUNT(DISTINCT NAME)
FROM ANIMAL_INS 
WHERE NAME IS NOT NULL 

이름에 대해 중복되는 이름 하나로 친다고 말했으니 중복제거 함수인 DISTINCT 를 NAME옆에 붙여서 COUNT 함수를 이용하여 갯수를 구한다. 그리고 추가로 NAME이  NULL값인것은 안가져온다고 하였으니 WHERE 절에 추가로 조건을 붙엳준다. 
중복제거인 DISTINCT 에 대하여 알아보다가 한가지 몰랐던 사실을 알게되어서 작성한다. DISTINCT 한 컬럼에만 적용할수 없고 SELECT문 뒤에 있는 모든 컬럼에 적용이 된다. SELECT DISTINCT COL1,COL2,COL3 이면 COL1,COL2,COL3이 모든 같은 행에 대해서만 중복이라판단하고 제거한다. SELECT (DISTINCT COL1),COL2,COL3 처럼 괄호안에 넣는 것은 문법위반이라 사용할수 없다.