[SQL] GROUP BY COUNT 시 없는 시간대도 나오게 하려면?
입양 시간대별로 입양 몇 건? 그룹바이 카운트 0시부터 23시까지, 그 중 0건인 시간대는 0으로 표시해야줘야 한다.
방법1. UNION 사용
- 0~23 모든 시간을 가진 테이블 생성 후 LEFT JOIN, IFNULL
1
2
3
4
5
6
7
8
9
SELECT H1.HR, IFNULL(OUTS.CNT, 0) AS 'CNT'
FROM (
SELECT 0 AS HOUR
UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 --...
) H_LIST
LEFT JOIN (
SELECT HOUR(DATETIME) AS 'HR', COUNT(*) AS 'CNT'
FROM ANIMAL_OUTS
GROUP BY HOUR) AS 'OUTS' ON H_LIST.HR = OUTS.HR
방법2. 변수 설정
1
2
3
4
5
6
SET @hour := -1;
SELECT (@hour := @hour + 1) as 'H',
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS 'CNT'
FROM ANIMAL_OUTS
WHERE @hour < 23;
- SET 옆에 변수명과 초기값을 설정하자!
- @가 붙은 변수는 프로시저가 종료되어도 유지
- 이를 통해 값을 누적하여 0부터 23까지 표현
- @hour은 초기값을 -1로 설정. :=은 비교 연산자 =과 혼동을 피하기 위한 대입 연산자
- 쿼리문 내에서는 무조건 = 는 비교연산자이기 때문에 := 사용해야됨
- SELECT (@hour := @hour +1) 은 @hour의 값에 1씩 증가시키면서 SELECT 문 전체를 실행하게 됨
- 이 때 처음에 @hour 값이 -1 인데, 이 식에 의해 +1 이 되어 0이 저장
- HOUR 값이 0부터 시작할 수 있음
- WHERE @hour < 23일 때까지, @hour 값이 계속 + 1씩 증가
출처
This post is licensed under CC BY 4.0 by the author.