프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABLE |
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABLE |
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_OUTCOME | VARCHAR(N) | FALSE |
고양이와 개는 몇 마리 있을까 (LEVEL 2)
동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.
SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS count FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE;
GROUP BY를 통해 고양이와 개를 그룹화시킬 수 있다. 또한, COUNT() 함수로 각 동물의 수를 조회할 수 있다.
고양이(Cat)가 개(Dog)보다 사전순으로 앞서므로 사전 순으로 조회하면 고양이가 개보다 먼저 조회된다.
동명 동물 수 찾기 (LEVEL 2)
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
SELECT NAME, COUNT(ANIMAL_ID)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL GROUP BY NAME HAVING COUNT(ANIMAL_ID) > 1 ORDER BY NAME;
우선 GROUP BY NAME으로 이름을 그룹화한다. 두 번 이상 쓰인 이름만 조회해야 하므로 HAVING 구절로 조회하면 된다. 또한, 이름이 없는(NULL) 동물은 제외해야 하므로 WHERE 구절에서 조건을 추가한다.
입양 시각 구하기(1) (LEVEL 2)
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR HAVING HOUR >= 9 AND HOUR < 20 ORDER BY HOUR;
ANIMAL_OUTS 테이블에는 DATETIME만 존재한다. 따라서, HOUR()로 DATETIME에서 시간만 추출한다. 각 시간대별로 조회하므로 GROUP BY HOUR를 통해 시간을 그룹화한다. 마지막으로 9시부터 19시 59분까지 조회해야 하니 WHERE 구절에서 조건을 추가하면 된다.
입양 시각 구하기(2) (LEVEL 4)
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
WITH RECURSIVE TIME AS (SELECT 0 AS h UNION ALL SELECT h+1 FROM TIME WHERE h < 23)
SELECT h AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM TIME LEFT JOIN ANIMAL_OUTS ON HOUR(DATETIME) = TIME.h GROUP BY HOUR ORDER BY HOUR;
위의 문제에서 조건만 0시부터 23시로 바꾸면 될것 같지만 데이터 내의 시간들이 0시부터 23시까지 모두 존재하지는 않기 때문에 결과는 몇몇 시간이 비게 나타난다.
우선, 0부터 23까지 1씩 추가하면서 조회하는 모든 결괏값을 합쳐서 TIME이라는 테이블을 만들어준다. 그리고 TIME이라는 테이블과 AINMAL_OUTS테이블을 JOIN 해서 겹친 테이블을 그룹화한다면 0시부터 23시까지 각 시간대별로 조회하면 된다.
'SQL' 카테고리의 다른 글
[프로그래머스 SQL 고득점 Kit] SUM, MAX, MIN (0) | 2022.04.01 |
---|---|
[프로그래머스 SQL 고득점 Kit] SELECT (0) | 2022.03.28 |
SQL 개념정리 (0) | 2022.03.27 |