✅ 문제 설명
ANIMAL_OUTS 테이블은 동물 보호소에서 입양된 동물의 정보를 담고 있습니다.
컬럼명설명
ANIMAL_ID | 동물 ID |
ANIMAL_TYPE | 동물 종류 |
DATETIME | 입양 일시 (시간 포함) |
NAME | 동물 이름 |
SEX_UPON_OUTCOME | 성별 및 중성화 여부 |
목표:
DATETIME 컬럼을 기준으로 0시부터 23시까지 시간별 입양 수를 조회하되, 입양이 없었던 시간도 0건으로 표시되어야 합니다.
📌 일반적인 SQL (문제점 있음)
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);
여기서 모르겠더라구요
- 위 쿼리는 입양이 발생한 시간대만 출력합니다.
- 입양이 한 건도 없는 시간대는 결과에 나타나지 않습니다.
✅ 해결 방법 1: WITH RECURSIVE 사용
모든 시간대(0~23시)를 재귀 CTE로 생성하여 LEFT JOIN하면, 입양이 없는 시간도 0으로 출력됩니다.
WITH RECURSIVE HOURS AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1 FROM HOURS WHERE HOUR < 23
)
SELECT
H.HOUR,
COUNT(A.ANIMAL_ID) AS COUNT
FROM HOURS H
LEFT JOIN ANIMAL_OUTS A
ON H.HOUR = HOUR(A.DATETIME)
GROUP BY H.HOUR
ORDER BY H.HOUR;
🔍 특징
- 시간 누락 없이 전체 24시간을 모두 출력합니다.
- 가장 신뢰도 높은 방법입니다.
참고한블로그 : https://velog.io/@dkan9634/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4SQL-%EC%9E%85%EC%96%91-%EC%8B%9C%EA%B0%81-%EA%B5%AC%ED%95%98%EA%B8%B02
✅ 해결 방법 2: 변수(@HOUR) 활용
MySQL에서는 사용자 변수 @HOUR를 사용해 시간대를 생성할 수도 있습니다.
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
ORDER BY HOUR;
🔍 특징
- 간단한 방식이지만, ANIMAL_OUTS 테이블에 최소 24개의 행이 있어야 전체 시간이 출력됩니다.
- 테이블에 데이터가 적으면 일부 시간이 누락될 수 있습니다.
'코테 문제풀이' 카테고리의 다른 글
[프로그래머스-JAVA] 뒤집힌 문자열 (1) | 2025.08.01 |
---|---|
002 숫자의 평균 구하기 백준온라인 1546 (1) | 2025.07.04 |
[프로그래머스-JAVA] 짝수 홀수 개수 (1) | 2025.06.13 |
001 숫자의 합 구하기 백준온라인 11720 (1) | 2025.06.02 |
[프로그래머스-Java] 배열 뒤집기 (4) | 2025.05.30 |