/////
Search
Duplicate

입양 시각 구하기(2)

태그
GROUP BY
전역변수
한 번 더 체크
목차

문제

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMENAMESEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

예시

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

정답

SET @hour := -1; SELECT (@hour := @hour +1) as HOUR, (SELECT COUNT(DATETIME) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT FROM ANIMAL_OUTS WHERE @hour < 23
SQL
복사

풀이

변수를 생성하고 변수를 이용하여 그룹핑을 진행하는 문제이다.
입양 시각 구하기(1)과 다른 점은 기록되지 않은 시간대의 입양 기록까지 구해야된다는 점이다.
만약 입양 시각 구하기(1)과 같이 GROUP BY를 사용하여 조회를 하면, 다음과 같이 조회된다.
→ 7에서 19까지만 조회가 되는데, 그 이유는 우리가 가진 데이터의 HOUR가 최소 7시부터 최대19시까지만 있기 때문이다.
그런데 우리는 0시부터 23시가 필요하기 때문에 변수를 생성해서 조회를 진행해야 한다.
SET @hour := -1;
SQL
복사
SET 절을 이용하면 변수를 선언할 수 있는데, 이때 변수명 앞에 @를 붙이면 프로시저가 끝나더라도 변수가 사라지지 않는다.
이때 변수를 선언하려면 =가 아니라 :=를 사용해야 한다.
SELECT (@hour := @hour +1) as HOUR,
SQL
복사
SELECT 절을 사용해서 변수를 계속해서 업데이트 할 수 있다.
@hour 변수에 계속해서 1을 더해가면서 SELECT 절을 실행한다.
(SELECT COUNT(DATETIME) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT
SQL
복사
@hour에 1이 더해진 이후 @hour를 HOUR(DATETIME)로 갖는 데이터를 조회한 뒤 이를 COUNT 해준다.
WHERE @hour < 23
SQL
복사
단, 0시에서 23시까지만 출력해야 하기 때문에 @hour가 23 미만일 때까지만 조회하는 것으로 제한을 둔다. 24가 아니라 23인 것에 유의해야 한다. 24로 두면 24까지 출력이 된다.