https://programmers.co.kr/learn/courses/30/lessons/59413
Oracle
-- 코드를 입력하세요
SELECT hours.hour, NVL(cnt, 0) "COUNT"
FROM (SELECT TO_CHAR(datetime, 'HH24') as hour, COUNT(*) cnt
FROM animal_outs
GROUP BY TO_CHAR(datetime, 'HH24')) outs,
(SELECT LEVEL-1 AS hour
FROM DUAL
CONNECT BY LEVEL <=24) hours
WHERE hours.hour = outs.hour(+)
ORDER BY hour
먼저 인라인 뷰(Inline View) outs를 살펴보면,
1. DATETIME을 24시간 형태 문자열로 바꾼다.
2. GROUP BY을 사용하여, 시간 별 칼럼 개수를 구한다.
다음 인라인 뷰 hours를 살펴보면,
개요. CONNECT BY 문을 사용하여 1~24을 표현
(원래, 계층적 데이터를 표현하기 위해서 사용된다.)
1. CONNECT BY문의 조건을 LEVEL이 24와 같거나 작을 때까지로 지정
2. LEVEL-1을 출력 (원래, LEVEL은 계층(깊이)를 의미한다.)
마지막으로 바깥 쿼리를 보면,
1. 시간별(hours.hour)로 입양된 동물(NVL(cnt, 0))을 출력
NVL : 첫번째 인자(cnt)가 NULL이라면 두번쨰 인자(0)으로 치환한다.
2. hours의 hour과 outs의 hour을 기준으로 JOIN
3. 시간 순으로 정렬하기 위해 ORDER BY hour
반응형
'방법 > 알고리즘&코딩 테스트' 카테고리의 다른 글
[Programmers] 보호소에서 중성화한 동물 Oracle (0) | 2020.07.24 |
---|---|
[Programmers] 오랜 기간 보호한 동물(1) MySQL, Oracle (0) | 2020.07.21 |
[Programmers] 오랜 기간 보호한 동물(2) MySQL, Oracle (0) | 2020.07.21 |