본문 바로가기
갭알 ☠️/SQL

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

by Niyaoh 2022. 8. 8.

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

 

프로그래머스

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

programmers.co.kr

ANIMAL_OUTS 테이블

NAME TYPE NULLABLE INFO
ANIMAL_ID VARCHAR(N) FALSE 아이디
ANIMAL_TYPE VARCHAR(N) FALSE 종류
DATETIME DATETIME FALSE 보호 시작일
NAME VARCHAR(N) TRUE 이름
SEX_UPON_OUTCOME VARHCAR(N) FALSE 성별 및 중성화 여부

 

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

 

 

▼ 해석 및 풀이

MySQL

/*
[테이블] : ANIMAL_OUTS
[나타낼 컬럼] : DATETIME(열 이름 'HOUR'), COUNT
[조회 조건] : DATETIME을 시간(0~23)으로 나누어 각 시간대별 데이터의 개수를 조회. 단, 데이터가 없어도 해당 시간대와 그 시간대의 데이터는 0으로 나와야 함.

SET @hour := -1 : 사용자 지정 변수 hour을 선언, 변수 값은 -1 (0시부터 나타내야함, 1씩 증가할거라)
@hour := @hour + 1 : ROW가 한번 지날 때마다 +1 (1씩 시간대가 증가)
WHERE @hour < 23 : 24시까지만 나타내고 종료
*/

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;

Oracle

/*
OUTER JOIN 연산자(+) : 데이터가 0이어도 조회하기 위해 OUTER JOIN 사용, 조인시킬 값이 없는 곳에 (+)를 위치시킴, 값 없으면 NULL로 표시
NVL(컬럼, '값이 NULL일 때 나타낼 값')
(LEVEL-1) : 시간대 0부터 시작
FROM DUAL CONNECT BY LEVEL <= 24 : 더미테이블 DUAL을 통해 시간대 24까지만 순번을 조회

시간을 00형식으로 형변환 시킨 후, 이를 그룹화 및 시간 순 정렬. 이 테이블은 A로 선언.
LEVEL을 통해 00부터 23까지의 목록을 만든 이 테이블은 B로 선언.

NULL인 값도 0으로 조회해야 하기 때문에 B와 A를 OUTER JOIN 시킴.
*/

SELECT B.HOUR, NVL(A.COUNT, 0) AS COUNT
FROM
    (SELECT TO_CHAR(DATETIME, 'HH24') AS HOUR, COUNT(*) AS COUNT
        FROM ANIMAL_OUTS
        GROUP BY TO_CHAR(DATETIME, 'HH24')
        ORDER BY HOUR) A,
    (SELECT (LEVEL-1) AS HOUR
        FROM DUAL CONNECT BY LEVEL <= 24) B
WHERE B.HOUR = A.HOUR(+)
ORDER BY HOUR;

 

 

댓글