SQL

[SQL] n개 이상 중복된 변수를 구분하여 count 하는 방법

ollive 2024. 6. 26. 20:45

<문제: 동명동물 수 찾기 >

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


<trial 1>

이름에 따라 구분지어 보았는데 이름의 수가 96개라고 집계되었다. 이름에 따라 count되어야 하는데 총 갯수만 도출되었다.

select name, count(distinct name)
from animal_ins
order by name

 

<trial 2>

이름으로 구분하여 집계해야 하므로 name을 distinct name으로 바꾸었다. count(name)이 되면 <시도1>과 같이 이름의 총량을 집계할 것이므로 고유한 번호인 animal_id를 count에 넣어주었다. 그랬더니 100으로 집계되어 등록된 동물의 총 마릿수가 100마리인 것을 알게되었다. 하지만 이 역시 이름마다 count 된 것은 아니다.

select distinct name, count(animal_id)
from animal_ins
order by name

 

< trial 3>

group by 절을 넣어주었다. distinct로 구분되면 group by 절을 써서 각각을 count 해주어야한다는 사실을 알게되었다.

이제 이름이 없는 동물은 집계에서 제외하고, 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회되도록 만들어야 한다.

select distinct name, count(animal_id)
from animal_ins
group by name
order by name

 

< trial 4> 

이름이 없는 동물은 집계에서 제외시키기 위해 where name is not null 문장으로 name에 null 값을 없애 주었다.

두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 2이상으로 제한하기 위해 having 절을 사용해주었다. having 절은 구글링을 찾아냈는데 좀 더 알아봐야 할 문법이다.

select distinct name, count(animal_id) 'count'
from animal_ins
where name is not null
group by name
having count > 1
order by name


<결론> 

n개 이상 중복된 변수구분하여 갯수를 세기 위해서는 SELECT, count(), FROM, GROUP BY, HAVING 이 필요하며 아래와 같이 구성된다.

 

SELECT distinct 변수명, count(각각 count할 수 있는 고유한 변수) as '변수명2'

FROM 테이블명

GROUP BY 구분될 변수명

HAVING 변수명2 > n