공부/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를 모두 출력해보았다.

애초에 모든 HOUR의 데이터가 DB에 존재하지 않았던거시다.

단순한 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은 필요 없는것 같아서 빼버렸다. 문제 해결은 했지만.. 내가 스스로 한건 별로 없는것 같아 찜찜하다. 앞으로 이것과 비슷한 문제가 나오면 잘 해결할 수 있을까? 문제 해결을 많이 해보는 수 밖에 없다.