본문 바로가기
SQL

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

by rubyda 2021. 4. 9.
728x90

문제 설명

 

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

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함수로 시간을 추출하고, GROUP BY 해서 COUNT하면 되겠다고 생각했다. 근데 틀렸다고 한다.ㅜㅜㅜ 우선 내가 생각한 방식대로 출력을 하면 다음과 같이 나온다.

 

실패 코드

SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);

 

문제를 잘 읽지 않았다. 문제를 다시 읽어보니 0시부터 23시까지 출력을 하라고 했는데 해당 데이터에서는 7시부터 데이터가 존재한다. 그래서 0~6시까지의 결과가 출력되지 않았다.

 

따라서 이 문제는 0~6시까지의 데이터를 따로 생성해줘야 한다. 어떻게 풀어야 할지 감이 안와서 다른 사람들의 코드를 보고 아이디어를 참고 했다.

 

이 문제에서는 SET 명령어를 사용해야 한다.

 

SET은 어떤 변수에 특정 값을 할당할때 쓰는 명령어이다.

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

다음 코드는 @HOUR변수에 -1을 할당한 후 22까지 +1씩 더해준다는 뜻이다!  

 

여기서 주의를 해야 한다. SET 사용시 대입 연산자를 '='를 사용하고 그 외에는 := 를 사용해야 한다. !! 다음과 같이 코드를 실행하면 아래와 같은 결과가 나온다.

 

밑에가 잘렸지만 23까지 잘 만들어졌다!

 

이제 카운트 하는 부분을 추가해보자.

SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS HOUR,
    (SELECT COUNT(HOUR(DATETIME)) 
    FROM ANIMAL_OUTS 
    WHERE HOUR(DATETIME)=@HOUR) AS COUNT 
    FROM ANIMAL_OUTS
WHERE @HOUR < 23;

- HOUR 변수를 -1로 선언하여서 22까지 +1씩 더해주었다. -1부터 더했기 때문에 0부터 23까지 생성이 된다.

- ANIMAL_OUTS 테이블에 있는 DATETIME 변수와 @HOUR 변수가 동일한 순간 카운트를 진행한다.

 

 

쉽다고 생각했는데 어려운 문제였다. 

 

 

참고)

chanhuiseok.github.io/posts/db-6/