[테이블]
ANIMAL_OUTS
테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS
테이블 구조는 다음과 같으며, ANIMAL_ID
, ANIMAL_TYPE
, DATETIME
, NAME
, SEX_UPON_OUTCOME
는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
[문제 설명]
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
우선 DATETIME이 어떤 형식으로 저장되었는지 확인했습니다.
테이블에서 DATETIME 은 DATETIME인 자료형을 사용하고 있기 때문에
SELECT DATETIME
FROM ANIMAL_OUTS
살펴보면
👉🏻 2013-12-22 11:30:00이렇게 되어있습니다
시간대별로 사용하기 위해서는 어떻게 해야할까요?
‘sql 시간대별 통계' 라고 검색했습니다
위의 블로그를 참고해서 문제를 풀었습니다!
⇒ HOUR(DATETIME)을 하게 되면 시간만 출력할 수 있더라구요!
SELECT HOUR(DATETIME) AS HOUR
그리고 저희 문제에도 조건이 있습니다!
09:00부터 19:59까지
조건문은 WHERE 절로 사용하네요
저희 문제로 적용을 시키면
WHERE DATETIME BETWEEN '09:00' AND '19:59'
이렇게 하면 될 줄 알았는데 안되네요,,,하핫
다시 해볼게요
WHERE HOUR BETWEEN '9' AND '19'
이것도 안되네요
저를 SQL의 세계로 입문시키신 프로님에게 물어보았습니다!히히
답변은 HAVING을 쓰면 된다!!
간단히 설명을 해주셨는데
HAVING은 GROUP BY의 WHERE 절이라고 알려주셔서 문제를 수월하게 풀 수 있게 되었어요~
그렇다면 다시
HAVING HOUR BETWEEN '9' AND '19'
답안
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN '9' AND '19'
ORDER BY HOUR ASC;
정답입니다!
정답 이후 참고
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
따라서
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR;
이렇게 하면 된다!
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY 1;