NullNull

프로그래머스 SQL 입양시각 구하기(2) 본문

SQL

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

KYBee 2022. 2. 28. 21:37

Data 구조

ANIMAL_OUTS : 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블

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

 

예시

Output: 

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

 

정답: 

입양 시각 구하기(1)과 비슷한 문제처럼 보이지만 접근 방식은 완전 다릅니다. 아직 입양 시각 구하기(1)을 풀지 않으셨다면 해당 문제보다 그 문제를 먼저 풀고 오시는걸 추천드립니다.

https://nullnull.tistory.com/4

 

이 문제를 입양 시각 구하기(1) 처럼 GROUP BY를 사용하여 푼다면 한가지 문제가 생깁니다. 바로 아무런 입양이 일어나지 않은 시각에 대한 처리가 불가능해집니다. OUTPUT을 보시면 0시 ~ 6시, 20시 ~ 23시에 아무 입양이 일어나지 않아서 0으로 집계된 것을 볼 수 있습니다. GROUP BY를 사용할 때는 존재하는 데이터를 그룹화 하는 것이므로 해당 문제는 다른 방법으로 풀어야 합니다.

 

따라서 입양 시각 구하기(2) 문제는 아래와 같은 순서로 풀어야 합니다.

1. SET을 사용하여 HOUR 변수를 만들어 결과 테이블에 0시 ~ 23시를 먼저 표현함

2. SELECT절에 서브쿼리를 활용하여 데이터를 시간 순서대로 카운팅하여 나타냄

 

1번을 먼저 진행하겠습니다. SQL에서 SET을 사용하면 변수를 만들 수 있습니다. 이때 @를 사용하면 프로시저가 끝나더라도 그 변수를 계속 사용할 수 있게 됩니다. 우선 HOUR 변수에 -1을 할당합니다.

그 다음 HOUR에 1을 더하면서 23보다 작을 때 까지 데이터를 표시하도록 합니다. 23 보다 작은 이유는 표현되는 데이터는 HOUR 변수에 1을 더한 값이기 때문에 23까지 표현해야 한다면 HOUR이 23 - 1인 22에서 멈춰야 하기 때문입니다. 

SET @HOUR = -1;

SELECT (@HOUR := @HOUR + 1) HOUR FROM ANIMAL_OUTS
WHERE @HOUR < 23;

위의 코드를 실행시킨 결과는 아래와 같습니다.

HOUR
0
1
2
3
4
...
19
20
21
22
23

 

다음으로 2번을 진행합니다. 이때 SELECT문에 서브쿼리를 작성하여 각 HOUR에 해당하는 시간을 COUNTING하여 표현하도록 해야 합니다. 서브쿼리란 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말합니다. 그래서 HOUR이 0부터 23까지 증가할 때 서브쿼리에 그 HOUR 변수를 전달하여 현재 HOUR에 들어있는 시간에 입양이 몇 번 되었는지 계산하여 결과로 표시합니다.

SET @HOUR = -1;

SELECT (@HOUR := @HOUR + 1) HOUR, 
(SELECT COUNT(*) COUNT FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @HOUR) COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
Comments