-
[프로그래머스]입양 시각 구하기(Lv.4)SQL 2023. 4. 12. 15:47
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
먼저, 전체 테이블 구조 확인을 했다.
문제에서 각 컬럼에 대해서 알려주지만, 직접 보는 것이 더 와닿는다.
SELECT * FROM ANIMAL_OUTS;
Date time은 yyyy-mm-dd 00:00:00 형식으로 되어있었다.
2013-12-22 11:30:00 우리에게 필요한 것은 '시간대' 2자리 숫자 뿐이다.
24시간으로 되어있다.
시간대를 구한다음 각 시간대를 COUNT 함수를 쓰면 될 것 같다.
날짜 형식을 바꾸기 위해서는 DATE_FORMAT 을 사용하면 된다고 한다.
https://happyguy81.tistory.com/119
24시간이기 때문에 '%H'를 넣어준다.
SELECT date_format(datetime, '%H') FROM ANIMAL_OUTS;
오! 성공
COUNT 함수 사용에서 막혔다..
SELECT date_format(datetime, '%H') as HOUR, count(animal_id) AS COUNT FROM ANIMAL_OUTS GROUP BY HOUR ORDER BY HOUR;
COUNT(HOUR)을 했더니 오류가 계속 떴다.
생각해보니 hour를 count하는게 아니었다.
그래서 animal_id로 count 했는데 실패!
예시를 보니 입양이 0건인 시간도 표시가 되어 있었다.
값이 없는 것도 0부터 23까지 표시를 해야한다는 건데...
IFNULL()을 사용하면 되는건가?
https://eggwhite0.tistory.com/113
근데 정확히 어떻게 쓰는건지 잘 모르겠다..
IFNULL(HOUR)로 하면 오류가 뜬다.
도저히 모르겠어서 오늘도 정답 확인....
SELECT HOUR, IFNULL(count, 0) as count FROM ( SELECT @N := @N +1 as hour FROM animal_outs, (SELECT @N := -1 FROM dual)nn limit 24 ) as a LEFT JOIN( SELECT hour(datetime) as hr, count(*)as count FROM animal_outs GROUP BY hr ) as b ON a.hour = b.hr
1. LEFT JOIN 사용: 왼쪽이 0부터 23까지 나타내고, 오른쪽에 count 값 나타내기
2. 왼쪽 테이블에 0부터 23까지 나타내기
오! 서치 하다가 위의 답을 쓰신 분의 풀이를 찾았다. (감사합니다..!!)
-1에서 시작해서 +1씩 더해지는 구조. -1+1 = 0이 시작이다.
(Q. 근데 왜 0부터 시작을 안했을까? select @N := 0 이 아닌 이유가 궁금.)
limit 이 24기 때문에, 0부터 세서 23에서 끝난다.
https://sewonzzang.tistory.com/81
SET 변수라고 하는구나.
https://stackoverflow.com/questions/11754781/how-to-declare-a-variable-in-mysql
3. FROM dual: 더미 테이블
https://harrydony.tistory.com/887
4. nn: null 아님
내가 시도한 것: LEFT JOIN 아랫부분..
hour(datetime) 이라니. 너무 심플한 방법이 있었다.
IFNULL을 count에다 주면 된다.
0~23까지 쓰는게 이렇게 어려울 줄 몰랐다.
'SQL' 카테고리의 다른 글
[프로그래머스]과일로 만든 아이스크림 고르기(LV.1) (0) 2023.06.11 [프로그래머스]자동차 대여 기록에서 장기/단기 대여 구분하기(Lv.1) (0) 2023.04.17 [프로그래머스]Lv.1 문제 모음 (0) 2023.04.13 [프로그래머스]우유와 요거트가 담긴 장바구니(Lv.4) (0) 2023.04.12 [프로그래머스]식품분류별 가장 비싼 식품의 정보 조회하기(Lv.4) (0) 2023.04.10