솔솔

[Oracle] 프로그래머스 입양시각 구하기(2) 본문

나의보물들/Oracle

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

솔솔하네 2022. 7. 5. 17:59
반응형

SQL문 실행 예시  

HOUR         COUNT

0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 3
8 1
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2
20 0
21 0
22 0
23 0

 

풀고 이해하는데 한참 걸렸네요 ㅠㅠ 그래도 한 단계 클리어해서 기분좋네요!


✨내가 이해한 풀이

 [코드]

select a.hour, nvl(count, 0) "count" 
from (select level -1 as hour from dual connect by level <= 24) a,
(select TO_CHAR(datetime, 'HH24') as hour, count(*) as count FROM animal_outs 
group by TO_CHAR(datetime, 'HH24')) b
where a.hour = b.hour (+)
order by hour

 [풀이]

1. 'animal_outs'에 있는 데이터로 2개의 임시테이블을 만든다.

  - 왼쪽 테이블(a)

select level -1 as hour from dual connect by level <= 24

 -- level -1 : level만 적을 시에 1부터 시작이나 -1을 적음으로써 0부터 시작
 -- from dual : 임시테이블 생성
 -- connet by level <= 24(값을 연속적으로 증가) : 23까지 증가 시킴(24보다 하나작은 값까지)

 - 오른쪽 테이블(b)

select to_char(datetime, 'HH24') as hour, count(*) as count FROM animal_outs 
group by TO_CHAR(datetime, 'HH24')
order by hour

-- to_char(datetime, 'HH24') : to_char()는 날짜를 문자열로 바꿔줌, 'animal_outs'테이블에 있는 datetime을 값으로 사용.
-- to_char(datetime, 'HH24') : 'HH -> 시간(hour)만 표시' '24 -> 24시간제로 표시(안적을시 12시간제로 표시됨)'

2. 두 테이블을 join하는데 왼쪽테이블에 기준으로 오른쪽테이블에 있는 null값도 결과로 보일 수 있게 한다.

(count 그룹 함수를 사용할 시 테이블의 'datetime'에 있는 값 외에 시간대는 집계가 안됨 그래서 left outer join함)

where a.hour = b.hour (+)

3. 두 테이블을 join했을 때 들고오고 싶은 컬럼을 선택한다. conunt컬럼의 null은 0으로 표시해준다.

select a.hour, nvl(count, 0) "count" 
from (a테이블 쿼리) a,(b테이블 쿼리) b
where a.hour = b.hour (+)
order by hour 

-- nvl(count, 0) 널처리 함수 : 'count는 사용할 값' '0은 지정값'