[변수] 입양 시각 구하기(2) ⭐⭐⭐⭐
카테고리: Programmers SQL
태그: DB SQL Coding Test
MySQL로 풀이했습니다.
출처 : 프로그래머스 https://programmers.co.kr/learn/challenges
📌 입양 시각 구하기(2)
난이도 ⭐⭐⭐⭐
🚀 문제
🚀 내 풀이 ⭕
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 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
가 대응 된다. (서브 쿼리)
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기