데이터셋 확인은 이전글 참조
2021.08.09 - [SQL/MySQL] - [프로그래머스] SQL 코딩테스트 연습 01. DB 확인
프로그래머스 SQL 문제들 중에서 어려웠던 문제들을 리뷰 차원에서 다시 한 번 풀어본다.
GROUP BY 카테고리의 입양 시각 구하기(2) 문제이다.
모든 문제들은 레벨1~4까지 있는데 다른 문제들과 다르게 레벨4로 압도적으로 높다.
언어는 MySQL과 ORACLE 중에서 선택할 수 있고, 본 해설에서는 MySQL 기준으로 풀어본다.
[문제]
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
[예시]
입양이 발생하지 않는 시간대도 함께 표시되어야 한다. 즉, 0시부터 23시까지의 전체적인 데이터가 나타나야 한다.
실제 입양이 발생한 데이터만 출력하는 것은 코드 몇줄로 간단하지만,
0시부터 23시까지 시각이 전부 나타나게 해야하기 때문에 쿼리가 길어지게 된다.
먼저, WITH 조건을 통해 0시부터 23시까지 로우가 존재하는 HOUR 컬럼이 담긴 임시 테이블을 생성한다.
그리고 입양이 발생한 데이터를 서브쿼리로 만들어 LEFT JOIN을 통해 결합한다.
그러면 입양 이력이 있는 COUNT 컬럼에는 값이 채워지고, NULL값을 0으로 변환하기 위해
IFNULL 함수를 사용한다.
-- 코드를 입력하세요
WITH TMP1 AS (
SELECT 0 AS HOUR UNION
SELECT 1 AS HOUR UNION
SELECT 2 AS HOUR UNION
SELECT 3 AS HOUR UNION
SELECT 4 AS HOUR UNION
SELECT 5 AS HOUR UNION
SELECT 6 AS HOUR UNION
SELECT 7 AS HOUR UNION
SELECT 8 AS HOUR UNION
SELECT 9 AS HOUR UNION
SELECT 10 AS HOUR UNION
SELECT 11 AS HOUR UNION
SELECT 12 AS HOUR UNION
SELECT 13 AS HOUR UNION
SELECT 14 AS HOUR UNION
SELECT 15 AS HOUR UNION
SELECT 16 AS HOUR UNION
SELECT 17 AS HOUR UNION
SELECT 18 AS HOUR UNION
SELECT 19 AS HOUR UNION
SELECT 20 AS HOUR UNION
SELECT 21 AS HOUR UNION
SELECT 22 AS HOUR UNION
SELECT 23 AS HOUR
)
SELECT TMP1.HOUR, IFNULL(TMP2.COUNT, 0) COUNT
FROM TMP1
LEFT JOIN (
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS A
GROUP BY HOUR(DATETIME)
ORDER BY HOUR
) AS TMP2 ON TMP1.HOUR = TMP2.HOUR
결과를 확인해보면
잘 출력되는 것을 확인할 수 있다.