[프로그래머스 SQL 고득점 Kit] GROUP BY(3)

손은영·2022년 8월 11일
0

SQL

목록 보기
4/8
post-thumbnail

3. 입양 시각 구하기(1)

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

NAMETYPENULLABE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE

[문제 설명]

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




우선 DATETIME이 어떤 형식으로 저장되었는지 확인했습니다.

테이블에서 DATETIME 은 DATETIME인 자료형을 사용하고 있기 때문에

SELECT DATETIME
FROM ANIMAL_OUTS

살펴보면

👉🏻 2013-12-22 11:30:00

이렇게 되어있습니다

시간대별로 사용하기 위해서는 어떻게 해야할까요?

‘sql 시간대별 통계' 라고 검색했습니다

[MYSQL] 시간대별 방문자 통계 구하기

위의 블로그를 참고해서 문제를 풀었습니다!

⇒ 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;

정답입니다!



정답 이후 참고

  • MYSQL 날짜 데이터에서 일부만 추출하는 법

YEAR
MONTH
DAY
HOUR
MINUTE
SECOND

  • sql에서도 따옴표는 문자열일 때 꼭 쓴다는 것
    하지만 위의 문제는 HOUR가 이미 숫자이기 때문에 쓰지 않아도 된다!
  • ORDER BY는 기본이 ASC이기 때문에 ASC는 생략

따라서

SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR;

이렇게 하면 된다!

  • ORDER BY 에서는 위의 SELECT 순으로 정렬할 수 있어서 ORDER BY HOUR ⇒ ORDER BY 1 로 할 수 있다!
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY 1;
profile
정글에서 살아남기

0개의 댓글