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;
'갭알 ☠️ > SQL' 카테고리의 다른 글
[프로그래머스/SQL] 이름이 있는 동물의 아이디 (MySQL, Oracle) (0) | 2022.08.08 |
---|---|
[프로그래머스/SQL] 이름이 없는 동물의 아이디 (MySQL, Oracle) (0) | 2022.08.08 |
[프로그래머스/SQL] 입양 시각 구하기(1) (MySQL, Oracle) (0) | 2022.08.08 |
[프로그래머스/SQL] 동명 동물 수 찾기 (MySQL, Oracle) (0) | 2022.08.08 |
[프로그래머스/SQL] 고양이와 개는 몇 마리 있을까 (MySQL, Oracle) (0) | 2022.08.08 |
댓글