아 쉽겠거니 하고 아래와 같이 풀었다.
-- 코드를 입력하세요
SELECT HOUR(DATETIME) AS HOUR, COUNT(SUBSTR(DATETIME,12,2)) AS COUNT
FROM ANIMAL_OUTS
GROUP BY SUBSTR(DATETIME,12,2)
ORDER BY SUBSTR(DATETIME,12,2)
바로 틀렸다...
0시부터 24시까지 출력해야하는데 group by로 해버리면 존재하는 시간만 출력하니 모든 시간이 다 나오지 않는다.
그래서 0부터 23시까지 시간부터 먼저 만들어놓아야한다.
SET @HOUR := -1;
SELECT (@HOUR := @HOUR + 1) AS HOUR,
(SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
아래는 GPT 설명...
이 SQL은 MySQL 사용자 변수(@변수)를 이용해서 0~23까지 시간을 직접 생성하고, 각 시간에 입양된 동물 수를 세는 방식입니다.
SET @HOUR := -1;
@HOUR라는 사용자 변수를 만듭니다.이유는 바로 아래에서
@HOUR := @HOUR + 1
이 실행되기 때문에 첫 값이 0이 되도록 하기 위해서입니다.
실행 흐름
초기값 -1
1번째 실행 → 0
2번째 실행 → 1
3번째 실행 → 2
...
SELECT (@HOUR := @HOUR + 1) AS HOUR
이 부분이 핵심입니다.
@HOUR := @HOUR + 1
→ 값을 1 증가시키면서 그 값을 반환합니다.
즉 실행될 때마다
| 실행순서 | @HOUR 값 |
|---|---|
| 1 | 0 |
| 2 | 1 |
| 3 | 2 |
| ... | ... |
| 24 | 23 |
이렇게 됩니다.
그래서 결과 테이블의 HOUR 컬럼이 0~23이 됩니다.
(SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @HOUR) AS COUNT
현재 만들어진 @HOUR 값과 같은 입양 시간의 개수를 세는 서브쿼리입니다.
예시
@HOUR = 3 이라면
SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = 3
즉
3시에 입양된 동물 수를 반환합니다.
FROM ANIMAL_OUTS
이 부분은 사실 데이터를 쓰기 위한 목적이 아닙니다.
단순히 SELECT가 여러 번 실행되도록 행 개수를 빌리는 것입니다.
예를 들어 ANIMAL_OUTS가 100행이면
SELECT도 100번 실행됩니다.
WHERE @HOUR < 23
@HOUR가 23이 될 때까지만 실행합니다.
실행 흐름
@HOUR = 0
@HOUR = 1
...
@HOUR = 23
→ 종료
그래서 24행(0~23)이 만들어집니다.
HOUR | COUNT
0 | 0
1 | 1
2 | 0
3 | 2
4 | 0
...
23 | 1
입양이 없는 시간도 0으로 출력됩니다.
이 SQL의 핵심은
1️⃣ 변수로 숫자 생성 (0~23)
2️⃣ 그 숫자를 이용해 서브쿼리로 COUNT
즉
시간 생성 → 그 시간 입양수 조회
패턴입니다.
@ 이걸로 변수를 만들수 있다는건 정말 처음 알았다.
뭔 이런 문제가 다 있어 라고 생각했지만 오늘도 하나 배워간다...