[MySQL] 프로그래머스 - 입양 시각 구하기 (1)

gramm·2021년 2월 15일
0

알고리즘 문제 리뷰

목록 보기
21/36

출처: 프로그래머스 코딩 테스트 연습
https://programmers.co.kr/learn/courses/30/lessons/59412




2가지 틀린 풀이

SELECT HOUR(DATETIME), COUNT(*) AS count
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING 9 <= HOUR(DATETIME) AND HOUR(DATETIME) <= 19
ORDER BY HOUR(DATETIME) ASC;

[실행 결과]

Unknown column 'DATETIME' in 'having clause'


SELECT hour, COUNT(*) AS count
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME) AS hour
HAVING 9 <= hour AND hour <= 19
ORDER BY hour ASC;

[실행 결과]

You have an error in your SQL syntax



문제 분석


첫 번째 풀이

SQL에서는 기본적으로 GROUP BY 절에 있거나 집계 함수가 사용된 컬럼만을 HAVING 절에서 사용할 수 있고, MySQL에서는 SELECT 문에 사용된 컬럼을 사용하는 것도 허용된다. 그런데 HOUR(DATETIME)는 컬럼 이름 앞에 함수가 붙었고, 그 함수가 집계 함수가 아니라 산술 함수이므로, HAVING절에서는 사용할 수 없는 것이다.


두 번째 풀이

GROUP BY 절에서는 SELECT 절과 달리, alias를 사용할 수 없다.



최종 풀이


SELECT HOUR(DATETIME) AS hour, COUNT(*) AS count
FROM ANIMAL_OUTS
GROUP BY hour
HAVING hour BETWEEN 9 AND 19
ORDER BY hour ASC;

위 코드와 같이, SELECT 문에서 HOUR(DATETIME)를 alias를 붙이는 방식으로 문제를 해결할 수 있다.
profile
I thought I introduced

2개의 댓글

comment-user-thumbnail
2021년 8월 18일

블로그에 출처를 남기고 문제 분석을 올려도 괜찮을까요 ? 늦은 시간이라 제 블로그에 먼저 올리고 싶습니다. 제 블로그 주소를 남길테니 혹시 거절하신다거나 하시면 바로 삭제조치 하겠습니다. 먼저 올려서 기분나쁘실 수 있으니 죄송합니다. https://blog.naver.com/have_13/222475380828 입니다. 다시한번 죄송합니다.

1개의 답글