[프로그래머스] SQL 고득점 Kit - GROUP BY
<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을 사용하였다.