본문 바로가기
프로그래머스SQL

[프로그래머스/SQL] 입양 시각 구하기(2) 오라클(Oralce)

by DongGoo 2023. 1. 13.

1. 입양 시각 구하기(2)(Oralce)

 

2. 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/59413

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

3. 문제

문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

예시

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

 

4. 풀이

- 1번 DUAL을 활용하고 LEVEL을 사용해서 0부터 23까지의 행을 생성하는 서브쿼리를 생성하고 L로 이름을 설정한다.

- 2번 ANIMAL_OUTS테이블의 DATETIME의 시간별 COUNT를 조회하는 서브쿼리를 생성하고 D로 이름을 설정한다.

- FROM절에서 1번 쿼리와 2번 쿼리를 불러 블러서 2번 쿼리 기준으로 조인한다. 그렇다면 해당하지 않는 값들은 NULL값으로 값이 입력 된다. 이때 최종적으로 조회할때 NVL함수를 사용해서 NULL값을 숫자0으로 만들고 조회한다.

 

5. 소스 코드

SELECT L.HOUR
    , NVL(COUNT ,0) AS COUNT
FROM (SELECT LEVEL -1 AS HOUR --1번 서브 쿼리
      FROM DUAL
      CONNECT BY LEVEL <= 24) L
    , (SELECT TO_CHAR(DATETIME,'HH24') AS HOUR --2번 서브 쿼리
       , COUNT(DATETIME) AS COUNT
       FROM ANIMAL_OUTS
       GROUP BY TO_CHAR(DATETIME,'HH24')
       ORDER BY TO_CHAR(DATETIME,'HH24')) D
WHERE L.HOUR = D.HOUR(+)
ORDER BY L.HOUR