https://programmers.co.kr/learn/courses/30/lessons/59412?language=mysql
문제 설명
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 |
Q) 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
이때 결과는 시간대 순으로 정렬해야 합니다.
예시
SQL문을 실행하면 다음과 같이 나와야 합니다.
HOUR | COUNT |
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
풀이 1. MySQL
-- 코드를 입력하세요
SELECT HOUR(DATETIME) AS "HOUR", COUNT(DATETIME) AS "COUNT"
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR;
- DATETIME 컬럼에 들어있는 데이터는 YYYY-MM-DD hh:mm:ss 형태이므로 시간단위만 쪼개서 써야한다.
- MySQL에 날짜 관련 함수 중 시간을 조회하는 HOUR() 함수가 있다.
- HOUR(DATETIME) AS "HOUR"를 통해 시간만 조회할 수 있다.
- 각 시간대별로 입양이 몇 건인지를 조회하는 문제로 GROUP BY 함수를 써서 HOUR를 그룹으로 묶는다.
- 그룹으로 묶인 HOUR에서 09:00부터 19:59까지의 조건이 있기때문에
- HAVING 절에 HOUR BETWEEN 9 AND 19 조건을 넣어 9시부터 19시까지만 조회하도록 한다.
- 결과는 시간대 순으로 정렬을 충족시키기 위해 ORDER BY HOUR 도 추가한다.
SELECT HOUR(DATETIME) AS "HOUR", COUNT(DATETIME) AS "COUNT"
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR
ORDER BY HOUR;
- HAVING을 사용하지 않고 WHERE을 사용해서 푸는 방법도 있다.
- 단, HAVING절에서는 별칭을 쓸 수 있지만 WHERE절에서는 별칭으로 조건을 쓸 수 없다.
풀이 2. Oracle
-- 코드를 입력하세요
SELECT TO_CHAR(DATETIME, 'HH24') AS "HOUR", COUNT(DATETIME) AS "COUNT"
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME, 'HH24')
HAVING TO_CHAR(DATETIME, 'HH24') BETWEEN 09 AND 19
ORDER BY HOUR
- Oracle에는 HOUR() 함수가 없기때문에 TO_CHAR()를 이용해서 시간을 추출한다.
- GROUP BY와 HAVING절의 코드는 위에 MySQL과 유사하다.
- Oracle은 MySQL과 다르게 WHERE, GROUP BY, HAVING에 별칭을 쓸 수 없다.
SELECT TO_CHAR(DATETIME, 'HH24') AS "HOUR", COUNT(*) AS "COUNT"
FROM ANIMAL_OUTS
WHERE TO_CHAR(DATETIME, 'HH24') BETWEEN 09 AND 19
GROUP BY TO_CHAR(DATETIME, 'HH24')
ORDER BY TO_CHAR(DATETIME, 'HH24')
- Oracle에서도 마찬가지로 HAVING말고 WHERE로 쓰는 방법이 있다.
실행 결과
HOUR | COUNT |
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
'프로그래머스 - SQL 고득점 Kit > GROUP BY' 카테고리의 다른 글
[프로그래머스 GROUP BY] #4. 입양 시각 구하기(2)(SET, WITH문, 다중쿼리, LEVEL) (0) | 2021.08.28 |
---|---|
[프로그래머스 GROUP BY] #2. 동명 동물 수 찾기(GROUP BY, HAVING) (0) | 2021.08.23 |
[프로그래머스 GROUP BY] #1. 고양이와 개는 몇 마리 있을까 (0) | 2021.08.23 |