본문 바로가기
Database

[프로그래머스 SQL - GROUP BY] 입양 시각 구하기(2)

by 진홍이 2021. 7. 7.
728x90

입양 시각 구하기(2)

문제

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. 
ANIMAL_OUTS 테이블 구조는 다음과 같으며, 
ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각
동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 
0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 
이때 결과는 시간대 순으로 정렬해야 합니다.

예시

갑자기 난이도가 급상승 했습니다.

로컬 변수를 활용해 푸는 방법으로 하겠습니다.

 

문제에서 원하는 것은

  • 0~23시 까지의 시간대를 표시
  • 시간대별로 COUNT를 사용
  • 시간대순으로 정렬

이렇게 3가지 입니다. 

바로 작성해 보겠습니다.

 

우선 시간정렬 부터 시키겠습니다.

SET @HOUR = -1;

SELECT 
    (@HOUR := @HOUR +1) AS HOUR
FROM 
    ANIMAL_OUTS
WHERE 
    @HOUR < 23;

SET 을 사용해 @HOUR변수에 초기값 -1을 지정해 주었습니다.

'@'가 붙은 변수는 프로시저가 종료해도 값은 유지 됩니다.

 

그 후에 SELECT에서 @HOUR에 대입연산자 :=를 사용해 줍니다.

@HOUR값에 @HOUR +1을 대입했습니다.

이렇게 +1씩 증가 시키면서 SELECT문 전체를 실행합니다. 

WHERE문의 조건이 충족할때까지 즉 @HOUR < 23 일때까지 반복합니다.

0부터 23까지 증가하기 때문에 따로 시간대별 정렬은 안하셔도 정렬이됩니다.

 

여기에 서브쿼리로 원하는 값을 추가하기만 하면 됩니다.

SET @HOUR = -1;

SELECT 
    (@HOUR := @HOUR +1) AS HOUR,
    (
    SELECT 
        COUNT(*) 
    FROM 
        ANIMAL_OUTS 
    WHERE 
        HOUR(DATETIME) = @HOUR
    ) AS COUNT
FROM 
    ANIMAL_OUTS
WHERE 
    @HOUR < 23;

서브쿼리에서는 COUNT로 갯수를 세고 

WHERE로 HOUR와 @HOUR가 같은것을 조회했습니다.

 

이렇게 작성하면 완성입니다.

 

출처:[프로그래머스 코딩테스트 연습] - https://programmers.co.kr/learn/courses/30/lessons/59413

 

728x90