https://school.programmers.co.kr/learn/courses/30/lessons/59413
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코딩테스트 연습 > GROUP BY > 입양 시각 구하기(2)
문제 분석
난이도: LEVEL4
문제 요구사항
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
정답 코드
WITH RECURSIVE TIME AS (
SELECT 0 HOUR
UNION ALL
SELECT (HOUR + 1) HOUR
FROM TIME
WHERE TIME.HOUR != 23
)
SELECT T.HOUR,
CASE
WHEN A.COUNT IS NULL THEN 0
ELSE A.COUNT
END COUNT
FROM TIME T LEFT JOIN (SELECT CASE
WHEN DATE_FORMAT(DATETIME, '%H') = 24 THEN 0
ELSE DATE_FORMAT(DATETIME, '%H')
END HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY 1) A
ON T.HOUR = A.HOUR
DATE_FORMAT Expression에서 %H: 24시간 형식 %h: 12시간 형식을 표현한다.
0 ~ 23시 까지 TIME CTE에 존재해서 시간이 24시면 0시로 변환한다. (CASE WHEN THEN 사용)
동일한 코드
WITH RECURSIVE TIME AS ( -- recursive cte 활용 0 ~ 23
SELECT 0 HOUR
UNION ALL
SELECT HOUR + 1
FROM TIME
WHERE HOUR != 23
),
ANIMAL_OUTS_TIME AS (
SELECT CASE
WHEN DATE_FORMAT(DATETIME, '%H') != 24 THEN DATE_FORMAT(DATETIME, '%H')
ELSE 0
END HOUR,
COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY 1
)
SELECT T.HOUR, CASE
WHEN A.COUNT IS NULL THEN 0
ELSE A.COUNT
END COUNT
FROM TIME T LEFT JOIN ANIMAL_OUTS_TIME A
ON T.HOUR = A.HOUR
ORDER BY 1
'Algorithm > Programmers SQL' 카테고리의 다른 글
[MySQL] 프로그래머스 멸종위기의 대장균 찾기 (0) | 2024.09.19 |
---|---|
[MySQL] 프로그래머스 보호소에서 중성화한 동물 (0) | 2024.09.19 |
[MySQL] 프로그래머스 우유와 요거트가 담긴 장바구니 (3) | 2024.09.19 |
[MySQL] 프로그래머스 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.09.19 |
[MySQL] 프로그래머스 5월 식품들의 총매출 조회하기 (0) | 2024.09.19 |