문제
풀이
SELECT T1.HOURS AS HOUR, IFNULL(T2.COUNT,0) AS COUNT
FROM
(SELECT @N := @N + 1 AS HOURS
FROM ANIMAL_OUTS, (SELECT @N := -1 FROM DUAL) NN LIMIT 24
)T1
LEFT JOIN
(SELECT HOUR(DATETIME) AS HOUR, COUNT(*)AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN '0' AND '24' -- 없으면 오류남!
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME))T2
ON T1.HOURS = T2.HOUR
해결 과정
1. 0~23까지 증가하는 컬럼(테이블에서의 각 열에 해당) 만들기
2. 둘을 JOIN 하기
3. NULL값에는 0을 주가
1. 0~23까지 증가하는 컬럼 만들기
DUAL을 사용하여 증가하는 쿼리문을 만들었다.
0부터 1씩 증가하고 , 24일 때 멈춘다.
SELECT @N := @N + 1 AS HOURS
FROM ANIMAL_OUTS, (SELECT @N := -1 FROM DUAL) NN LIMIT 24
2. 둘을 JOIN 하기
LEFT JOIN ( = LEFT OUTER JOIN)
A의 내용은 그대로 있고 B와 겹치는 부분의 내용을 추출할 수 있다. 그리고 A의 내용과 일치되지 않는 구문은 null 값을 반환하게 된다.
-- 명시적 조인
SELECT column_name(s)
FROM table1 A
LEFT JOIN table2 B
ON A.column_name=B.column_name; -- 조건
-- 암시적 조인
SELECT column_name(s)
FROM table1 A , tlable2 B
WHERE A.column_name=B.column_name(+); -- 조건
0~23까지 있는 컬럼에서 ANIMAL_OUTS과 겹치는 값을 구하고 싶기 때문에 LEFT JOIN을 사용했다.
3. NULL값에는 0을 주기 - IFNULL
Column의 값이 NULL을 반환할 때, 다른 값으로 출력할 수 있도록 하는 함수이다.
SELECT IFNULL(Column명, "Null일 경우 대체 값") FROM 테이블명;
문제가 복잡해서 블로그를 참고하여 해결했다.
아직 DUAL을 이용하여 증가하는 칼럼을 만든 부분이 이해가 잘 안 가지만..
더 공부하도록 해야겠다.
https://happyguy81.tistory.com/118?category=798348
https://happyguy81.tistory.com/125
https://blog.leocat.kr/notes/2017/07/28/sql-join-on-vs-where
https://makand.tistory.com/entry/SQL-LEFT-JOIN-%EA%B5%AC%EB%AC%B8
https://velog.io/@gillog/DB-MySQL-NULL-%EC%B2%98%EB%A6%ACIFNULL-CASE-COALESCE
'DataBase > SQL Queries' 카테고리의 다른 글
[프로그래머스]JOIN - 없어진 기록 찾기 / LEFTJOIN, 서브쿼리(Subqueries) (0) | 2022.03.22 |
---|---|
[프로그래머스] IS NULL, IS NOT NULL, IF NULL (0) | 2022.03.18 |
[프로그래머스] GROUP BY - 입양 시각 구하기(1) / 통계 유형별 조회, BETWEEN (0) | 2022.03.07 |
[프로그래머스]GROUP BY - 동명 동물 수 찾기 (0) | 2022.02.09 |
[프로그래머스]GROUP BY - 고양이와 개는 몇 마리 있을까 (0) | 2022.02.06 |