공부/SQL
[SQL] Programmer - 입양시각 구하기(2) <GROUP BY, SET @>
porkbellyYam
2023. 4. 7. 22:49
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은 필요 없는것 같아서 빼버렸다. 문제 해결은 했지만.. 내가 스스로 한건 별로 없는것 같아 찜찜하다. 앞으로 이것과 비슷한 문제가 나오면 잘 해결할 수 있을까? 문제 해결을 많이 해보는 수 밖에 없다.