[SQL] Programmer - 입양시각 구하기(2) <GROUP BY, SET @>
2023. 4. 7. 22:49ㆍ공부/SQL
Problem
Solution
SELECT HOUR(DATETIME) AS HOUR, IFNULL(COUNT(DISTINCT(ANIMAL_ID)), 0) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
ORDER BY HOUR
COUNT 가 NULL 값인 경우에 0을 반환하게 했음에도 불구하고, HOUR 칼럼의 모든 ROW가 출력되지 않았다.
도대체 왜 IFNULL() 함수가 제대로 동작하지 않는지... 궁금해서 HOUR를 모두 출력해보았다.
단순한 GROUP BY 문제인줄 알았던 나의 착각. 그러면 DB에 존재하지 않는 HOUR를 생성해야하는게 우선일것 같다.
0부터 23까지의 HOUR가 있는 테이블을 생성하고 ANIMAL_OUTS 테이블에서 그걸 사용해야하나보다. 요건 해본적이 없어서 검색을 좀 해봤다..
검색결과를 보니 거의 대부분의 사람들이 SET을 이용해서 문제를 해결했다.
문제에서 원하는 시간대는 0시 부터 23시까지의 ROW들이 필요하다. 이걸 SET 을 통한 변수 선언을 통해 해결한다.
SET @HOUR = -1;
SELECT (@HOUR :=@HOUR +1) AS HOUR
FROM ANIMAL_OUTS
WHERE @HOUR<23;
위 코드는 @HOUR 변수에 -1을 할당해 입력값 1을 0부터 시작하게 한다는뜻 그리고 WHERE 절에 @HOUR는 23보다 작다는 조건을 더해 0부터 23까지만 반환할 수 있도록 했다.
SET @HOUR = -1;
SELECT
(@HOUR :=@HOUR +1) AS HOUR,
(
SELECT COUNT(ANIMAL_ID)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME)=@HOUR
) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR<23
GROUP BY HOUR
ORDER BY HOUR
아까 작성했던 쿼리문을 이식했다. IFNULL은 필요 없는것 같아서 빼버렸다. 문제 해결은 했지만.. 내가 스스로 한건 별로 없는것 같아 찜찜하다. 앞으로 이것과 비슷한 문제가 나오면 잘 해결할 수 있을까? 문제 해결을 많이 해보는 수 밖에 없다.
'공부 > SQL' 카테고리의 다른 글
[SQL] Programmers - 상품별 오프라인 매출 구하기 <GROUP BY> (0) | 2023.04.08 |
---|---|
[SQL] Programmers - 나이 정보가 NULL 회원 수 구하기 <NULL, COUNT, SUM> (0) | 2023.04.08 |
[SQL] Programmers - 년, 월, 성별 별 상품 구매 회원 수 구하기 <GROUP BY, INNER JOIN, COUNT> (0) | 2023.04.07 |
[SQL] PROGRAMMERS - 즐겨찾기가 가장 많은 식당 정보 출력 <GROUP BY, SUBQUERY> (0) | 2023.04.07 |
[SQL] Programmers - 조건에 부합하는 중고거래 댓글 조회 <INNER JOIN, WHERE, DATE_FORMAT> (0) | 2023.04.07 |