728x90
반응형

문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. 
ANIMAL_OUTS 테이블 구조는 다음과 같으며, 
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는
각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

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

 

이 문제의 핵심은 0시부터 23시까지의 데이터를 출력해야한다.

 

처음에 단순하게 GROUP BY 를 사용해서 출력해보았다.

select DATE_FORMAT(datetime, "%H") as hour, count(DATE_FORMAT(datetime, "%H")) as count
from animal_outs
group by DATE_FORMAT(datetime, "%H")
order by DATE_FORMAT(datetime, "%H") asc;

결과는 데이터가 없는 시간에 대해서는 나오지 않았다. 당연한 결과다.
그럼 여기서 비어있는 시간대를 어떻게 0으로 표시해줄 수 있는지에 대해서 고민해봤다.

쿼리 상으로 어떻게 할 수 있을지 생각해보다가 결국 검색하러감 ㅎㅎㅎ

 

검색해보니 0시~23시 의 시간대가 주어져야 하고 그 시간대에 맞게 데이터를 입력해주어야 한다는 것이었다.

 

검색했던 방법 중에 한 가지 방법을 통해 문제를 풀어봤다.

 

SET 을 사용해서 hour 값을 만들어서 +1 씩 더해주어 0시부터 23시의 시간을 출력했고
hour 값인 경우 count 를 해서 각 시간마다 카운팅을 해서 값을 출력했다.

 

한정된 쿼리 내에서 해결하려고 하다보니 문제를 해결하지 못했던 것 같다.
따라서, 아래의 쿼리를 통해 원하는 결과를 얻을 수 있었다.

SET @hour = -1;

select (@hour := @hour +1) as hour, 
        (
            select count(DATE_FORMAT(datetime, "%H"))
            from animal_outs
            where @hour = DATE_FORMAT(datetime, "%H")
        ) as count
from animal_outs
where @hour < 23;

 

 

728x90
반응형
복사했습니다!