[SQL] 프로그래머스 GROUP BY 문제

오도원공육사·2021년 10월 14일
0

SQL

목록 보기
5/15

문제 출처.

프로그래머스 GROUP BY 문제

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

문제

  • 동물 중 고양이와 개가 각각 몇 마리인지 조회.
  • 단, 고양이를 개보다 먼저 조회

풀이

  • 동물을 유형별로 몇 마리인지 조회
    • ANIMAL_TYPE을 기준으로 GROUP BY한다.
  • 고양이(Cat)을 개(Dog)보다 먼저 조회
    • ANIMAL_TYPE 오름차순으로 조회
    • ASC는 생략가능
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS `count` FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;

2. 동명 동물 수 찾기

문제

  • 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회
  • 이름이 없는 동물은 집계에서 제외
  • 결과는 이름 순으로 조회해주세요.

풀이

  • NAME으로 GROUP BY
  • 2번 이상인지 그룹화 후에 조건이므로 HAVING 조건식
  • COUNT(FIELD)로 하면 NULL은 제외된다.
  • 이름 순이므로 ORDER BY NAME ASC
  • ASC는 생략가능
SELECT NAME, COUNT(NAME) AS `COUNT` FROM ANIMAL_INS
GROUP BY NAME
HAVING `COUNT` >= 2
ORDER BY NAME;

3. 입양 시각 구하기 (1)

문제

  • 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회
  • 결과는 시간대 순으로 정렬

풀이

  • DATETIME에서 시간을 체크할려면 HOUR 함수로 시간을 추출한다.
  • 추출한 시간을 WHERE로 비교한다
  • 시간에 만족하는 데이터에 대해서 HOUR별로 GROUP BY 한다.
  • 각 시간별 COUNT 조회 후 DATETIME으로 정렬한다.
SELECT HOUR(DATETIME) AS `HOUR`, COUNT(*) AS `COUNT` FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
GROUP BY HOUR(DATETIME)
ORDER BY `HOUR`;

4. 입양 시각 구하기 (2)

문제

  • 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
  • 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회
  • 결과는 시간대 순으로 정렬

풀이

  1. 시간대별로 출력하기 위한 인덱스 값 구하기
  • =는 같은지 체크하는 비교연산자
  • 실제 할당연산자는 :=를 사용해야한다.
SET @H := -1;
SELECT @H := @H + 1, HOUR(DATETIME) AS `HOUR`
FROM ANIMAL_OUTS
WHERE @H < 23;
  1. HOUR에 따른 COUNT 값을 가져온다.
SELECT HOUR(DATETIME), COUNT(*) FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);
  1. 위 둘을 합친다.
  • IFNULL(값, NULL일때대체할값)
SET @H := -1;

SELECT @H := @H + 1 AS `HOUR`,
IFNULL(
	(SELECT COUNT(*) FROM ANIMAL_OUTS
	WHERE @H = HOUR(DATETIME)
	GROUP BY HOUR(DATETIME))
, 0) AS `COUNT` FROM ANIMAL_OUTS
WHERE @H < 23
ORDER BY @H;
profile
잘 먹고 잘살기

0개의 댓글