[변수] 입양 시각 구하기(2) ⭐⭐⭐⭐

Date:     Updated:

카테고리:

태그:

MySQL로 풀이했습니다.
출처 : 프로그래머스 https://programmers.co.kr/learn/challenges

📌 입양 시각 구하기(2)

난이도 ⭐⭐⭐⭐

🚀 문제

https://programmers.co.kr/learn/courses/30/lessons/59413


🚀 내 풀이 ⭕

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

SET @HOUR = -1;
SELECT @HOUR := @HOUR + 1, -- 1 열
        -- 2 열
       (SELECT COUNT(*) 
        FROM ANIMAL_OUTS
        WHERE HOUR(DATETIME) = @HOUR)
FROM ANIMAL_OUTS
WHERE @HOUR < 23 

SQL 도 변수라는게 있구나.. 처음 알게 된 문제..!! (이 문제는 못 풀겠어서 구글링한 문제다.) 이전 문제인 입양 시각 구하기(1) 문제와는 다르게 이 문제 시간 별로 그룹 짓기가 힘들다. 문제의 결과 테이블에선 0, 즉 해당 시간에 해당하는 데이터가 없는 NULL 값도 0으로서 취급을 하고 있는데(입양 시간이 07~19시 까지만 있는데 그 외 시간도 취급함) 집계 함수는 NULL은 제외하고 집계하기 때문이다. 따라서 0 부터 24 까지 값을 가지는 시간 변수를 두고 변수값과 그 변수값을 시간으로 가진 열이 일치하는 행만 추려서 이렇게 걸러낸 모든 행들의 개수 COUNT(*)를 출력하면 된다.


변수 사용 법

  • @가 붙은 변수는 프로시저가 종료되어도 유지된다.
  • 변수 선언 👉 = 사용
    • SET @변수이름 = 값;
    • 변수 사용시 ; 세미콜론 꼭 붙이기.
  • 변수 대입 👉 := 사용
    • SET @변수이름 := 값
  • 변수도 SELECT 로 열 이름 같이 출력 가능. 값을 가지고 있기 때문!


실행 순서

서브쿼리는 쿼리문 안에 또 다른 쿼리문이 있는 경우를 뜻한다. 작성한 위의 코드에서 출력해야할 두 번째 열 (SELECT COUNT(*)FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR)이 서브 쿼리문이라고 할 수 있겠다.

  • 출력하는 1 열 : @HOUR 변수값으로 0 ~ 23
  • 출력하는 2 열 : SELECT COUNT(*)FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR
SET @HOUR = -1;
SELECT @HOUR 
FROM ANIMAL_OUTS

이 테이블이 전체 100 행까지 있다면 100 개의 행을 가진 @HOUR 열을 출력한다. 100 개 행의 -1 이 출력된다.

SET @HOUR = -1;
SELECT @HOUR 
FROM ANIMAL_OUTS
WHERE @HOUR < 23

그래도 여전히 100 개 행의 -1 이 출력됐다. 모든 행의 @HOUR 값이 -1 로 처리되서 그런건가.. (어렵따)

SET @HOUR = -1;
SELECT @HOUR := @HOUR + 1
FROM ANIMAL_OUTS
WHERE @HOUR < 23

오 이제는 딱 24 개 행만 0,1,2,3,..,23 의 @HOUR 값 으로 출력되었다. WHERE @HOUR < 23 를 뺴면 0,1,2,3,..,99 값의 100 개 행으로 출력이 된다.

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

하나의 @HOUR := @HOUR + 1 값의 행마다 (메인 쿼리) SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR 가 대응 된다. (서브 쿼리)



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Programmers SQL 카테고리 내 다른 글 보러가기

댓글 남기기