Tech/Problem Solving

[프로그래머스] SQL 고득점 Kit - GROUP BY

Bellroute 2022. 3. 1. 22:13

 

프로그래머스에서 제공하는 SQL 고득점 Kit 문제 풀이 코드입니다. (정답 주의)

 

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

고양이와 개는 몇 마리 있을까 (level 2)

GROUP BY는 특정 칼럼 항목들을 기준으로 묶어주는 역할을 하는 구문이다.

COUNT와 함께 자주 쓰이는데, 이 문제와 같이 항목 별 레코드 갯수를 구하는데 용이하다.

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count
FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN ('Cat', 'Dog')
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

 

동명 동물 수 찾기 (level 2)

WHERE 절을 이용한 조건은 일반적인 SELECT에서만 유효하다.

GROUP BY한 결과에 대한 조건을 붙이고 싶을 때는 HAVING을 이용한다.

SELECT NAME, COUNT(NAME) AS 'COUNT'
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT >= 2
ORDER BY NAME

 

입양 시각 구하기(1) (level 2)

데이터 형식이 DATETIME인 경우 HOUR()를 이용하면 시간만 추출할 수 있다.

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT'
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR > 8 AND HOUR < 20
ORDER BY HOUR

 

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

WITH 키워드를 이용해 임시 테이블을 생성할 수 있다.

해당 문제에서는 0-23의 숫자를 레코드를 갖는 임시 테이블을 만들고자 WITH를 사용했다.

RECURSIVE라는 키워드를 이용해서 for문과 유사한 로직을 수행하도록 하였다.

이렇게 임시로 생성된 테이블과 본 테이블을 JOIN해서 ANIMAL_OUTS가 가지지 못하는 시간대도 레코드로 표시될 수 있도록 하였다.

RIGHT JOIN의 경우 두 테이블을 JOIN할 때 후에 오는 테이블을 기준으로 JOIN(전자 테이블에 데이터가 없다면 Null처리)을 하도록 한다.

WITH RECURSIVE HOURS AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 FROM HOURS WHERE HOUR < 23
)

SELECT H.HOUR, IFNULL(COUNT(HOUR(O.DATETIME)), 0) AS COUNT
FROM ANIMAL_OUTS AS O
RIGHT JOIN HOURS AS H
ON HOUR(O.DATETIME) = H.HOUR
GROUP BY H.HOUR
ORDER BY H.HOUR

 

반응형