본문 바로가기

Tech/Problem Solving

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

 

프로그래머스에서 제공하는 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

 

반응형