프로그래밍/MySQL

[MySQL] 프로그래머스 SQL GROUP BY 답 해설

모영이 2021. 2. 17. 15:30

 

프로그래머스

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

programmers.co.kr

#1 고양이와 개는 몇 마리 있을까

GROUP BY로 고양이와 개로 나눈다음 COUNT로 그 수를 세주면 된다. 

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count 
FROM ANIMAL_INS 
GROUP BY ANIMAL_TYPE 
ORDER BY ANIMAL_TYPE

 

#2 동명 동물 수 찾기

이름으로 나눈다음 COUNT한 값이 1보다 크면 이라는 조건을 걸어준다.

HAVING은 GROUP BY 뒤에 사용하여 그룹화할 것의 조건을 걸어주도록 한다.

SELECT NAME, COUNT(NAME) AS COUNT 
FROM ANIMAL_INS 
WHERE NAME IS NOT NULL
GROUP BY NAME 
HAVING COUNT(NAME) > 1
ORDER BY NAME ASC;

 

#3 입양 시각 구하기(1)

HOUR을 사용해서 DATETIME에서 시간 값만 가져오고, GROUP BY로 시간으로 나눈다. 

시간이 9시 부터 19시까지 라는 조건을 걸어준다. COUNT로 그 시간의 값들이 몇 개 있는지 체크한다.

SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS 
GROUP BY HOUR
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY HOUR ASC

 

#4 입양 시각 구하기(2)

SET @hour로 전역 변수를 선언 하고 SELECT에서 값을 출력하고, WHERE문에서 조건을 걸어준다.

내부 SELECT문에서 @hour값과 ANIMAL_OUT의 DATETIME의 시간 값을 비교하여 데이터 개수 값을 COUNT해준다.

WHERE문에서 @hour의 조건을 걸어두는데 0시 부터 23시까지이기에 @hour가 -1로 초기화 하고 23까지 계속 1을 더해주는 식이다.

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;

 

정리하기 

GROUP BY : 유니크한 데이터로 그룹화

HAVING : GROUP BY에 조건을 건다.

COUNT : 개수 세기

SET @변수명 : 전역 변수 선언