프로그래머스에서 제공하는 SQL 고득점 Kit 문제 풀이 코드입니다. (정답 주의)
문제 링크
고양이와 개는 몇 마리 있을까 (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
반응형
'Tech > Problem Solving' 카테고리의 다른 글
[프로그래머스] SQL 고득점 Kit - JOIN (0) | 2022.03.01 |
---|---|
[프로그래머스] SQL 고득점 Kit - IS NULL (0) | 2022.03.01 |
[프로그래머스] SQL 고득점 Kit - SUM, MAX, MIN (0) | 2022.03.01 |
[프로그래머스] SQL 고득점 Kit - SELECT (0) | 2022.03.01 |
[프로그래머스] 사칙연산 - Java (0) | 2022.02.23 |