본문 바로가기
알고리즘/SQL

SQL(프로그래머스) / GROUP BY(고양이와 개는 몇 마리 있을까, 동명 동물 수 찾기, 입양 시각 구하기(1), 입양 시각 구하기(2))

by clean_h 2022. 1. 9.
728x90

SQL(프로그래머스) / GROUP BY(고양이와 개는 몇 마리 있을까, 동명 동물 수 찾기, 입양 시각 구하기(1), 입양 시각 구하기(2))

https://programmers.co.kr/learn/courses/30/parts/17044

 

프로그래머스

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

programmers.co.kr


 

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

문제 : 동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

 

COUNT() : 그룹에 포함되는 데이터 개수
GROUP BY : 특정 칼럼 그룹화
ORDER BY : 정렬

 

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

ANIMAL_TYPE의 종류는 Cat과 Dog만 존재한다. GROUP BY로 ANIMAL_TYPE을 그룹화하고, ORDER BY를 통해 정렬한 후 COUNT를 출력할 수 있다. 

 

 


 

동명 동물 수 찾기

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

 

COUNT() : 그룹에 포함되는 데이터 개수
WHERE NAME IS NOT NULL : NULL이 아닐 때

GROUP BY : 특정 칼럼 그룹화
HAVING : 그룹화 조건문, 조건이 맞는 그룹 추출
ORDER BY : 정렬

 

SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME

WHERE문으로 NAME 중 NULL이 아닌 것들만 그룹화한다. 이름으로 그룹화한 것 중 COUNT가 2이 이상만 추출한 후 ORDER BY로 이름 순으로 정렬한다. 

 

 


 

입양 시각 구하기(1)

문제 : 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

HOUR() : 시간 추출
COUNT() : 그룹에 포함되는 데이터 개수
WHERE : 테이블 조건문

GROUP BY : 특정 칼럼 그룹화
ORDER BY : 정렬

시간 이외에도 연도, 월, 일 등 다앙한 값을 추출할 수 있다. 

 

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

HOUR을 이용하여 시간을 추출할 수 있다. WHERE문으로 HOUR의 9시부터 19시까지만 추출하는 조건문을 걸어주고 GROUP BY로 시간별 그룹화 해준다. 데이터를 정렬하기 위해 ORDER BY를 사용해준다.

 

 


 

입양 시각 구하기(2)

문제 : 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

SET : 변수 선언
HOUR() : 시간 추출
COUNT() : 그룹에 포함되는 데이터 개수
WHERE : 테이블 조건문

 

변수 선언

SET @(변수명) := 값;

SQL에는 비교연산자 '=='이 존재하지 않고 '='만 존재한다.

그래서 변수 선언할 때 '='을 사용하게 된다면 비교연산자인지, 대입연산자인지 구분이 되지 않는다. 따라서 이런 혼동을 막기 위해 '='을 사용하지 않고 ':='을 사용하여 대입연산자로 구분해준다. 

 

 

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

SET을 통해 @HOUR 변수 선언을 해준다. 쿼리문에서 변수를 활용하여 0시부터 23시를 모두 조회해야 한다.

@HOUR은 +1씩 증가하고, WHERE 조건문에서 HOUR(DATETIME)에서 얻은 시간과 변수 @HOUR와 같은 시간을 세어 준다. 

변수 @HOUR가 0시부터 23시까지 조회할 수 있다. 

 

 


 

 

728x90

댓글