코테 문제풀이

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

임진묵식뽕뽑기 2025. 5. 29. 23:54

✅ 문제 설명

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개의 행이 있어야 전체 시간이 출력됩니다.
  • 테이블에 데이터가 적으면 일부 시간이 누락될 수 있습니다.