목차
문제
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_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까지 출력이 된다.