▶ SQL 코딩 테스트 연습 > GROUP BY > 입양 시각 구하기(2)
1.테이블 정보
2.문제
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
이때 결과는 시간대 순으로 정렬해야 합니다.
3.요구사항 분석 및 SQL문
1) 1차 시도 - 오답
-- 조회 : 시간, 입양 횟수
-- 그룹 : 시간별 (0 - 23)
-- 정렬 : 시간순
SELECT TO_CHAR(DATETIME, 'HH24') AS 시간
,COUNT(DATETIME) AS 입양횟수
FROM ANIMAL_OUTS
GROUP BY TO_CHAR(DATETIME, 'HH24')
HAVING TO_CHAR(DATETIME, 'HH24') BETWEEN 00 AND 23
ORDER BY 시간
>>
HAVING 절에 0시부터 23시까지의 조건을 걸었지만 07 ~ 19시 까지의 결과만 조회되었다
다른 시간대는 데이터가 없기 때문인 거 같다
2) 2차 시도 - WITH AS, LEVEL
WITH A AS(
SELECT
LEVEL -1 AS 시간
FROM
DUAL
CONNECT BY LEVEL <= 24 )
SELECT A.시간
, COUNT(B.DATETIME) AS 입양횟수
FROM A LEFT OUTER JOIN ANIMAL_OUTS B
ON A.시간 = TO_CHAR(B.DATETIME, 'HH24')
GROUP BY A.시간
ORDER BY A.시간
데이터가 없는 시간대도 조회하기 위해서 WITH AS로 재귀테이블을 만들었다.
FROM 절이 DUAL이라 가상 테이블이라는 것을 짐작 할 수 있는데,
이렇게 만들어두면 같은 SQL편집기 안에서는 여러번 참조해서 사용 할 수 있는 것 같다.
LEVEL을 사용해서 계층형 쿼리를 만들고 루트노드는 -1로 설정했다.
오라클은 자바와 달리 숫자가 1부터 시작하기 때문에 생략 할 경우 1시부터 조회되므로 요구사항인 0 ~ 23시를 충족 할 수 없다. 참고로 자바는 0부터 시작. 그래서 FOR문 돌릴 때 인덱스를 0부터 고려했었다.
마지막으로,
재귀테이블과 DB에 있는 테이블을 JOIN하는 SELECT 쿼리를 작성해서 문제를 해결했다.
4.실행 결과
너무 길어서 중간에 잘랐지만 0시부터 23시까지 잘 조회되었다
'Algorithm' 카테고리의 다른 글
[Java/백준] 2750.정렬 - 수 정렬하기1 (삽입정렬) (0) | 2022.11.07 |
---|---|
[ Java/ 백준 ] 2480.조건문 - 주사위 세개 (0) | 2022.11.04 |
[Oracle / 프로그래머스 SQL] 입양 시각 구하기(1) - having 절과 쿼리 실행 순서 (0) | 2022.02.15 |
[Oracle / 프로그래머스 SQL 연습] 중복 제거하기 - NULL 과 비교연산자/논리연산자 (0) | 2022.02.15 |
[Oracle / 프로그래머스 SQL 연습] SELECT > 여러 기준으로 정렬하기 (0) | 2022.02.15 |