본문 바로가기
Language/DB

[Programmers | SQL | SUM, MAX, MIN 문제 풀이] 중복 제거하기 - Solution with COUNT() & DISTINCT

by ㅇ달빛천사ㅇ 2024. 5. 29.
728x90

KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | SQL CODEKATA

중복 제거하기

🏷 Topic : COUNT DISTINCT SUBQUERY INLINE VIEWS


문제 설명

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


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


✔ (Oracle & MySQL) Solution with COUNT & DISTINCT

SELECT COUNT(DISTINCT NAME) COUNT
FROM ANIMAL_INS;
실행 결과

✔ Solution with Subqueries(Inline Views)

SELECT COUNT(*)
FROM (SELECT DISTINCT NAME 
     FROM ANIMAL_INS
     WHERE NAME IS NOT NULL);

💥 어떤 문제가 있었고, 나는 어떤 시도를 했는지💦 & 어떻게 해결했는지👍

COUNT함수 사용법 잊어버림.💥
DISTINCT 사용법 잊어버림 : 속성 앞에 쓰는 건지 뒤에 쓰는 건지 기억이 잘 안 났음. 💥
그래서 처음엔 감으로 코드를 씀💦


SELECT COUNT(*) 
FROM (SELECT DISTINCT NAME 
      FROM ANIMAL_INS 
      WHERE NAME IS NOT NULL);

틀린 부분이 없는 것 같은데 실패라고 뜸.😥
근데 뭔가 복잡해 보이는...
훨씬 간단하게 쓸 수 있을 것만 같은 느낌이 들어서 구글링 시도 🔎
중복 제거, count에 대해 구글링하다가 바로 안나와서 그냥 다시 감으로 써 봄. 💦


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

🎉 드디어 정답!!🎉


그런데 아까 처음에 쓴 코드는 뭐가 틀린걸까? 하는 의문이 듦. 💥
다시 코드를 써서 제출해 봤는데 이것도 정답⁉🎉
정답 코드를 2개나 썼다.😃


-- 2024-06-16 MySQL로 문제 풀이 시도 및 쿼리 수정 --


MySQL 쿼리는 작성을 하지 않았어서 다시 문제를 풀어 보았다.
전에 쓴 코드를 보니 WHERE절에 NULL값을 제외하는 조건을 썼다.

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

그런데 생각해보니 집계함수는 NULL을 무시하지 않았던가? 하는 생각이 들어서
COUNTDISTINCT를 사용한 쿼리에 WHERE절의 조건을 쓰지 않고 쿼리를 실행 해 보았다.
(별칭도 COUNT라고 줌.)

SELECT COUNT(DISTINCT NAME) COUNT
FROM ANIMAL_INS;

제출을 해 보니 정답이라고 뜬다.

집계함수는 NULL을 무시한다.

다시 한번 기억해 두어야 겠다.🤓

이 문제에서는 Oracle 쿼리와 MySQL 쿼리에 차이가 없이 모두 위의 코드로 원하는 결과를 조회할 수 있다.


💬 무엇을 새롭게 알았는지

  • DISTINCT 속성명
  • COUNT(속성명) 또는 COUNT(*)
  • FROM절 서브쿼리를 inline Views라고도 함.
  • 서브 쿼리: 쿼리 안에 또 다른 쿼리가 하나 더 있는 것을 말함.
  • (SELECT, WHERE, FROM절 서브쿼리가 가장 자주 쓰임)
  • 집계함수는 NULL값을 무시한다.

📚 References(참고 자료)

728x90


Top