SQL 문제 풀이 - (3) GROUP BY

zio도미닉·2021년 8월 14일
1

SQL 문제풀이

목록 보기
3/7

Programmers SQL

3. GROUP BY

GROUP BY

  • 고양이와 개는 몇 마리 있을까
    - GROUP BY를 쓰는 이유는 고양이 별로, 개 등 종류 별로 COUNT를 하고 싶어 (묶기 위해) 사용한다.
    - 즉 고양이만, 개만 카운트하기 위해서보다는 종류 별로 묶이 위해 사용
	SELECT ANIMAL_TYPE, COUNT(*) as count
	FROM ANIMAL_INS
	GROUP BY ANIMAL_TYPE
	ORDER BY ANIMAL_TYPE
  • 동명 동물 수 찾기
	SELECT NAME, COUNT(NAME)
	FROM ANIMAL_INS
	GROUP BY NAME -- 이름별로 묶음
	HAVING COUNT(NAME)>=2 -- 2번 이상 쓰인 이름 / GROUP BY로 묶여진 것을 세기 위해 HAVING 사용
	ORDER BY NAME; -- 결과는 이름 순으로 조회 
  • 입양 시각 구하기(1)
	SELECT HOUR(DATETIME) AS HOUR, COUNT(*)
	FROM ANIMAL_OUTS
	GROUP BY HOUR -- 시간으로 묶음 
	HAVING HOUR BETWEEN 9 AND 20 -- 09~19:59 사이 
	ORDER BY HOUR(DATETIME);  -- 오름차순 

- 입양 시각 구하기(2)
- 원하는 값

- 첫번째 시도

	SELECT HOUR(DATETIME) AS HOUR, COUNT(1) AS COUNT
	FROM ANIMAL_OUTS
	GROUP BY 1
	HAVING 1 BETWEEN 0 AND 23
	ORDER BY 1;

  • 원하는 결과가 나오지 않음
  • 이는 GROUP BY 후 COUNT로 묶어서 집계되는 것만 세기 때문에 0이 카운트 되지 않음 -> 따라서 메모리 상에 가상 테이블을 저장할 수 있는 WITH RECURSIVE를 이용
  • WITH RECURSIVE
	WITH RECURSIVE 테이블명 AS(
    	SELECT 초기값 AS 별명1
    	UNION ALL
    	SELECT 별명1 계산식 FROM 테이블명 WHERE 제어문)
    
    -- 사용예제 
	WITH RECURSIVE CTE AS(
    	SELECT 1 AS H
    	UNION ALL
    	SELECT H+1 FROM CTE WHERE H<5)

REF : https://hyunmin1906.tistory.com/149

  • 2번째 시도 및 확인
	WITH RECURSIVE time AS (
    	SELECT 0 AS h
    	UNION ALL
    	SELECT h+1 FROM TIME WHERE h < 23
	)
	SELECT h AS HOUR, count(DATETIME) 
	FROM time
    	LEFT JOIN animal_outs on h = hour(datetime)
	GROUP BY h
	ORDER BY h;
profile
BackEnd Developer

0개의 댓글