- 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
WITH RECURSIVE 구문 사용
WITH RECURSIVE TIME AS(
SELECT 0 AS h
UNION ALL
SELECT h+1 FROM TIME
WHERE h < 23)
SELECT h, COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM TIME LEFT OUTER JOIN ANIMAL_OUTS
ON h=HOUR(DATETIME)
GROUP BY h
ORDER BY h;
① WITH RECURSIVE TIME AS(
# 가상 테이블명 TIME 생성
② SELECT 0 AS h
UNION ALL
SELECT h+1 FROM TIME
WHERE h < 23)
# 0 초기값 설정
# 0 이라는 h 에서 1을 더해준다
# h 가 23이 되기 전까지, 즉 h=22 이고 +1 을 해주기 때문에 0부터 23까지의 값을 구해준다
③ SELECT h, COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM TIME LEFT OUTER JOIN ANIMAL_OUTS
ON TIME.h=HOUR(ANIMAL_OUTS.DATETIME)
# 가상의 테이블 TIME 과 animal_outs 테이블을 LEFT 조인 해준다(0~23까지의 값 전부)
# join 은 TIME 의 h 값과 animal_outs 의 datetime 값
# datetime 을 카운트 해준다
* ON h=hour(datetime) 으로 바꾸어 주어도 됨
: 각각의 테이블을 꼭 호출해주어야 하는줄 알았는데, 컬럼명이 1개이면 가능한 듯 ?
SET 함수 사용
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
ORDER BY HOUR;
① SET @hour = -1;
# hour 라는 변수에 -1을 넣어준다
② SELECT (@hour := @hour+1) AS HOUR,
# hour 라는 변수에 +1 을 대입해준다.
>> -1 := -1 + 1
>> 0 := 0 + 1
>> 1 := 1 + 1
>> 반복
③ WHERE @hour < 23
# 변수 hour 가 22까지 반복해준다
>> 22 := 22+1
④ WHERE HOUR(DATETIME) = @hour) AS COUNT
# hour 변수와 시간이 같을 때 카운트 해준다.
WITH RECURSIVE
WITH RECURSIVE 테이블명 AS(
SELECT 초기값 AS 컬럼별명1 # 비반복문
UNION ALL # 두 테이블 연결
SELECT 컬럼별명1 계산식 FROM 테이블명
WHERE 제어문 # 정지조건
)
SET 함수
SET @변수명 = 변수값 ; # 변수 선언 및 값 대입
SELECT @변수명 := 대입값 # 대입값 입력
SET 이외의 명령문에서는 = 가 비교연산자로 취급되기 때문에
:= 를 사용하여 값을 대입해준다.
단일쿼리문이 아닌, 여러 쿼리문을 수행할 때에는 세미콜론(;) 을 넣어 구분해주어야 한다
참고:
https://school.programmers.co.kr/learn/courses/30/lessons/59413#qna
'SQL 코드카타' 카테고리의 다른 글
자동차 대여 기록 별 대여 금액 구하기 (0) | 2024.04.18 |
---|---|
특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.04.16 |
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.04.09 |
헤비 유저가 소유한 장소 # where 절 서브쿼리 (0) | 2024.04.04 |
자동차 평균 대여 기간 구하기 (1) | 2024.04.04 |