그냥 공부

[프로그래머스] SQL 고득점 Kit - GROUP BY

seungh2 2022. 4. 29. 22:53

<SQL 고득점 Kit - String, Date>

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

 

프로그래머스

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

programmers.co.kr

 

1. GROUP BY

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

동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하여라. 이때, 고양이를 개보다 먼저 조회하여라.

 

SELECT ANIMAL_TYPE, COUNT(*) FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN ('Dog', 'Cat')
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

 

ANIMAL_TYPE이 'Dog', 'Cat'에 속하면 COUNT 한다. 이때, ANIMAL_TYPE으로 묶고(GROUP BY 절) ANIMAL_TYPE으로 정렬한다. (ORDER BY)

 

동명 동물 수 찾기

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하여라. 이때 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회하여라.

 

SELECT NAME, COUNT(*) NUM FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING NUM > 1
ORDER BY NAME

 

이름으로 묶고 (GROUP BY절) NAME이 NULL이 아니면 COUNT한다. 이때, NUM이 1보다 크면 포함한다.

 

입양 시각 구하기(1)

보호소에서 몇 시에 입양이 가장 활발하게 일어나는지 알고 싶다. 9:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하여라. 이때 결과는 시간대 순으로 정렬해야 한다.

 

SELECT HOUR(DATETIME), COUNT(*) FROM ANIMAL_OUTS 
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR(DATETIME) 
ORDER BY HOUR(DATETIME)

 

DATETIME에서 시간을 추출하고(HOUR) 이 값이 9와 19 사이의 값일 경우에 COUNT 한다.

 

입양 시각 구하기(2)

보호소에서 몇 시에 입양이 가장 활발하게 일어나는지 알고 싶다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하여라. 이때 결과는 시간대 순으로 정렬해야 한다.

 

SET @hour = -1;
SELECT (@hour := @hour + 1) as HOUR,
        (SELECT COUNT(*) FROM ANIMAL_OUTS
         WHERE HOUR(DATETIME) = @hour) as CNT
FROM ANIMAL_OUTS
WHERE @hour < 23

 

보호소에 입양되는 시간에는 0시부터 8시까지는 없다! 따라서 입양 시각 구하기(1)과는 달리 0시부터 8시까지는 0으로 채우고 나머지는 입양 시각 구하기(1)의 결과처럼 나오게 해야 한다.

 

0부터 23까지의 숫자가 ANIMAL_OUTS 테이블에서 HOUR(DATETIME)에 존재하면 COUNT 한다.

0부터 23까지의 숫자를 사용하기 위해 @hour을 사용하였다.

 

728x90