programmers.co.kr/learn/courses/30/lessons/59412
1. 서론
이 문제 솔직히 좀 복잡하고 어려웠다 ㅎ (쿼리 자체가 아니라 처음 쓰는 개념들 때문에)
2. 문제 풀이
ANIMAL_OUTS: 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블
테이블 구조:
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME
(각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부)
Q. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
문제의 키 포인트
1. 9~ 19시 사이 시간제한
2. 시간대 별 입양 total
3. 시간대 순 정렬
여기서 문제는 datetime이다. datetime의 데이터 형식을 분해해야 한다. datetime은 시스템에서 date를 그냥 생성한 형태라서 문자열에다가 년, 월, 시, 분, 초가 전부 적혀있다. 여기서 유의미한 데이터인 시간만 뽑아서 써야 한다.
날짜 타입 참조: nown2210.tistory.com/92
to_char() 함수를 사용하면 원하는 값을 분리해서 사용할 수 있는데 이 경우에는 24시간제이므로 HH24를 썼지만 이외에도 YYYY, YY, MM(월), MI(분), HH24, HH12 등 다양하다.
(년 YYYY, 월 MM, 일 DD, 시 HH24, 분 MI, 초 SS)
시간은 저렇게 분리하고, 시간제한은 조건이 걸려있기 때문에 조건문을 사용해야 하는데 이때 시간과 그 횟수를 같이 조회해야 하기 때문에 group by를 쓰므로 having을 사용해 조건을 걸어야 한다. 그리고 order by를 사용해 시간대 순으로 정렬해준다.
3. 코드 설명
SELECT to_char(datetime, 'HH24') HOUR, count (to_char(datetime, 'HH24')) COUNT
FROM animal_outs
GROUP BY to_char(datetime, 'HH24')
HAVING to_char(datetime, 'HH24') >= 9 and to_char(datetime, 'HH24') <= 19
ORDER BY to_char(datetime, 'HH24');
to_char로 시간을 구해준다. 그리고 그걸 count 한다. count 했기 때문에 group by도 한다.
문제에 9시부터 19시까지라고 적혀있었기 때문에 having절에서 처리해준다.
시간대 순으로 정렬해야 하기에 order by를 썼다.
그런데 보면 to_char ~~ 가 너무 긴데 계속 반복해서 나오는 게 너무 꼴 보기가 싫다. 따로 변수로 만들어서 쓰고 싶었으나 어찌하는지 몰라 그냥 무식하게 풀었는데 이런 코드를 발견했다.
SELECT hour, count(*)
FROM
(SELECT TO_CHAR(datetime,'HH24') AS hour
FROM animal_outs)
WHERE hour BETWEEN 09 AND 19
GROUP BY hour
ORDER BY hour;
서브 쿼리를 써서 to_char 부분을 따로 변수로 쓰는 것이다... 솔직히 배운 지 너무 오래돼서 서브 쿼리 where에서만 써봄...
이렇게도 쓸 수 있다니 신기하다. 그리고 까먹고 있었던 BETWEEN까지... 이 분은 프로다.
+MySQL
SELECT date_format(datetime, '%H') as hour, count(*)
FROM animal_outs
WHERE date_format(datetime, '%H') >= 9 and date_format(datetime, '%H') <= 20
GROUP BY hour
ORDER BY hour;
MySQL 공부할 일 있어서 작성했다.
to_char도 어떻게 하는지 까먹어서 인터넷에 쳐봤는데 MySQL에서는 date_format이란다... 진짜 통일 좀 해라
About date_format
https://atoz-develop.tistory.com/entry/Oracle의-TOCHAR-함수와-대응되는-MySQL-함수
'SQL' 카테고리의 다른 글
[ORACLE] 프로그래머스 오랜 기간 보호한 동물(1) (+MySQL) (0) | 2021.03.14 |
---|---|
[ORACLE] LeetCode Second Highest Salary (0) | 2021.03.13 |
[ORACLE] 프로그래머스 NULL 처리하기(+MySQL) (0) | 2021.03.11 |
[ORACLE] 프로그래머스 동명 동물 수 찾기 (0) | 2021.03.11 |
[ORACLE] 프로그래머스 고양이와 개는 몇 마리 있을까 (0) | 2021.03.11 |