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

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/59413

SELECT B.TIME AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM (SELECT LPAD(LEVEL - 1, 2, 0) TIME FROM DUAL CONNECT BY LEVEL < 25) B, 
    ANIMAL_OUTS A
WHERE B.TIME = TO_CHAR(DATETIME(+), 'HH24')
GROUP BY B.TIME
ORDER BY B.TIME;

(1)은 그냥 주어진 DATETIME 내에서 구하는 문제였는데, 이번 문제는 0부터 23 시 동안의 입양 건수를 구하는 문제였다. 쉬울 줄 알았는데 생각보다 애먹은 문제. 답을 찾아봤다..

애초에 TO_CHAR(DATETIME, ‘HH24’)로 가져올 수 있는 hour는 DATETIME의 값에 정해져 있기 때문에, DATETIME에 0시 ~ 8시 등등의 시간대가 존재하지 않으면 해당 시간대는 뽑아올 수 없다.

그렇기 때문에 0부터 23시까지의 가상의 데이터를 넣어줘야한다. 그렇게 하기 위해서는 계층 인라인 뷰를 생성해서 아우터 조인을 해주는 방식을 취했다.

값이 없으면 하나도 카운트가 안되기 때문에 0이 들어간다.

LPAD의 첫번째 파라미터는 값, 두번째는 크기, 세번째는 왼쪽부터 채울 값을 의미한다. 23부터 10까지는 그대로 들어가고 그 밑 9부터는 왼쪽에 0을 채우는 방식으로 값이 만들어진다. 이 인라인 뷰를 hour만 뽑아낸 DATETIME과 아우터 조인.