본문 바로가기
코딩 테스트

[Programmers] SQL코딩테스트3 | GROUP BY

by 카프리썬 2021. 4. 5.
728x90

프로그래머스SQL 뽀개기!! 일주일동안 매일 하나의 유형 다 뽀개기! 챌린지!

아래의 문제는 프로그래머스 SQL코득점 Kit 내용이며 코드는 직접 푼 내용입니다.

 


1. 고양이와 개는 몇마리

동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회

이때 고양이를 개보다 먼저 조회

SELECT animal_type,count(animal_type) as "count" 
from animal_ins 
group by animal_type 
order by animal_type

결과가 같다고 끝내지말고, 문제의 조건을 다 확인하자!

 

2. 동명동물수 찾기

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회

이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회

SELECT name, count(name) 
from animal_ins 
group by name 
having count(name)>=2
order by name

count(컬럼) : 널값 제외하고 개수구하기

group by name : 이름으로 묶은 다음에, 그 중에서 조건에 해당하는것 만 조회 -> having

 

3. 입양시각 구하기1

09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회

이때 결과는 시간대 순으로 정렬

SELECT hour(datetime)as "HOUR",count(datetime) as "COUNT" 
from animal_outs 
group by hour(datetime) 
having HOUR >='9'and HOUR <='19' 
order by HOUR
  •  

datetime을 시간순으로 묶는게 조금 당황스러웠지만 그냥 무턱대고 hour로 묶어봤다. 

그리고 결과엔 7-19로 나와있었는데 다 했다고 착각하고, 또 조건을 놓쳤다. 

시간대별로 group by로 묶은다음, 9-19사이니까 having으로 조회한다.

 

다른풀이

hour을 모를때, substr로 푸는 방법

select hour, count(hour)
from (SELECT substr(datetime,12,2)-0 as hour from animal_outs) hours
group by hour
having hour between 9 and 19
order by hour
  • substr(문자열,몇번째부터, 몇글자)

 

4. 입양시각 구하기2

0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회

이때 결과는 시간대 순으로 정렬

 

3번이랑 다른점은 시간대의 범위이다.

이전에는 데이터에서 뽑아낸 값들로 변수의 범위를 지정했다면

이번에는 hour변수를 0부터 23까지 직접 만들어야한다.

 

먼저, 이렇게 변수들만 만들어낼때는 set 을 사용해서 로컬변수를 만든다.

즉, 쿼리문에서 사용할 변수이다. 그럼 hour의 컬럼값으로 0부터 23까지 들어간다.

SET @hour := -1; select (@hour := @hour+1) as "HOUR" from animal_outs where @hour<23

그리고, 다음컬럼에 와야할 값들은 해당시간에 존재하는 값들의 개수이다.

즉,count(*)로 컬럼개수를 세면되는데 로컬변수에 해당하는 시간과 일치하는 where조건을 추가한다 

결론적으로 위의 두개의 코드를 합치는 것이다. 

최종답은 이렇다.

set @hour := -1;

select (@hour := @hour+1) as HOUR,
(select count(*) from animal_outs   where hour(datetime) = @hour) as COUNT 
from animal_outs 
where @hour <23

 

참고 : chanhuiseok.github.io/posts/db-6/

 

[프로그래머스] 입양 시각 구하기(1), (2) (GROUP BY, HAVING, SET)

[프로그래머스] 입양 시각 구하기(1), (2)

chanhuiseok.github.io

loy124.tistory.com/274

 

mysql GROUP BY 문제 프로그래머스 - 입양 시각 구하기(2)

다른 문제에 비해 생각할게 많은거같았다.. 1. 시간별로 나타내기위한 인덱스 값 구하기 일단 첫번째로 0시부터 23시까지 시간대별로 나타내기위한 인덱스 값이 필요했다 set이라는 메소드를 활

loy124.tistory.com

 

반응형