본문으로 바로가기

[프로그래머스] Oracle : GROUP BY

category 알고리즘/SQL 2022. 1. 11. 15:58
728x90

 

고양이와 개는 몇 마리 있을까

 

- 동물의 타입과 타입별로의 count를 구하는 문제이다.

이때 Group By절에는 집계함수외의 행들이 들어가야 하고, 고양이를 먼저 조회해달라 했으므로 오름차순으로 정렬한다.

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) as count FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY 1 asc;

 

동명 동물 수 찾기

 

- 동물의 이름과 count를 조회하고, 이 중 동물 이름이 2번 이상 쓰인 이름을 조회해야 하므로

그룹함수의 조건절인 HAVING을 통해 작성한다. 또한 이름 순으로 조회하므로 ORDER BY로 마무리한다.

 

SELECT NAME,COUNT(NAME) as COUNT FROM ANIMAL_INS WHERE NAME IS NOT NULL 
GROUP BY NAME HAVING COUNT(NAME)>=2 ORDER BY 1 asc;

 

입양 시각 구하기(1)

 

- DATETIME에서 시간만 추출하기 위해 TO_CHAR()를 사용하였고, 이에 대한 COUNT와 조건으로 주어진 09:00~19:59에 맞춰 범위를 설정해주었다. 마지막으로 시간대 순으로 정렬이므로 첫번째 행을 오름차순으로 정렬한다.

 

SELECT TO_CHAR(DATETIME,'HH24') as HOUR, COUNT(TO_CHAR(DATETIME,'HH24')) as COUNT 
FROM ANIMAL_OUTS GROUP BY TO_CHAR(DATETIME,'HH24') 
HAVING TO_CHAR(DATETIME,'HH24')>=9 and TO_CHAR(DATETIME,'HH24')<20 ORDER BY 1 ASC;

 

입양 시각 구하기(2)

 

- 문제가 어려워서 다른 사람들의 풀이를 보며 작성하였다.

SELECT의 값을 하나씩 자동 증가시키기 위해서 CONNECT BY를 사용하였고, 이와 별개로 각각의 시간별로

동물의 수를 조회해야 하므로 조인을 사용하고, 값이 없어도 시간에 대한 모든 결과값을 조회해야 하므로

왼쪽 외부조인을 사용하여 이를 나타내었다.

 

SELECT HOUR, COUNT(O.DATETIME) AS COUNT
FROM(
SELECT LEVEL -1 AS HOUR FROM DUAL
CONNECT BY LEVEL<25) A
LEFT JOIN ANIMAL_OUTS O
ON A.HOUR=TO_CHAR(O.DATETIME,'HH24')
GROUP BY HOUR ORDER BY HOUR;

 

 

728x90