본문 바로가기
Tests/프로그래머스

[프로그래머스] SQL GROUP BY 입양 시각 구하기(2)

by 코딩하는 금융인 2020. 8. 24.

문제. SQL > GROUP BY > 입양 시각 구하기(2)


문제 설명

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문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

HOUR COUNT
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 3
8 1
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2
20 0
21 0
22 0
23 0

출처 : 프로그래머스 SQL 입양 시각 구하기(2)

 

코딩테스트 연습 - 입양 시각 구하기(2)

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr


나의 풀이

#1 실패

#[Programmers] SQL > GROUP BY > 입양 시각 구하기(2)
SELECT HOUR(DATETIME) HOUR, COUNT(HOUR(DATETIME)) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
ORDER BY HOUR

처음에는 상당히 간단한 문제라고 생각했습니다. 시간대별로 GROUP BY하여 COUNT하고 마지막으로 정렬해주면 끝이라고 생각했습니다. 하지만, 예시에서 보여지듯이 0시부터 23시까지 입양이 0건을 포함하여 조회해야하므로 해당 풀이의 경우, 이 조건을 만족시키 못하여 틀렸습니다.

 

#2 성공

#[Programmers] SQL > GROUP BY > 입양 시각 구하기(2)
SET @HOUR = -1;
SELECT
    (@HOUR := @HOUR + 1) HOUR,
    (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR ) COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23

곰곰히 생각하다 HOUR 변수를 만들어 풀면 되겠다 싶어 여러 가지 시도를 했습니다. 하지만, 어떤 식으로 만들어야 막막했고 다른 사람들의 풀이를 참고하여 풀었습니다.

처음에 SET을 이용하여 HOUR 변수에 -1을 넣어줬습니다. 그 다음, HOUR를 1씩 증가시키며 그에 따른 시간대별 입양 건수를 서브쿼리를 이용하여 만들었습니다. HOUR는 0시부터 23시까지이므로 마지막에 WHERE로 23시까지의 조건을 넣어주고 풀었습니다.

SQL의 경우, 다른 프로그래밍 언어와 다르게 SET을 이용할 때는 대입 연산자를 '='를 사용하고 그 외에는 :=를 사용해야 합니다. 보통 SQL에서는 '='를 비교 연산자로 사용하므로 꼭 ':='를 사용해야 합니다.

(풀다가 계속 에러가 나와서 이번 기회에 배웠습니다. ㅠㅠ)

반응형

댓글