코딩테스트/SQL
[SQL Lv4] 입양 시각 구하기(2)
박창준
2024. 11. 26. 09:06
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 풀이
1. 0부터 23시까지 hour을 출력해야는데 hour의 범위가 0부터 23까지가 아니였다.
2. 어떻게 만들어야할까 고민하다가 우선 무작정 0부터 23까지의 임시 테이블을 만들었다.
3. 그리고 이걸 LEFT OUTER JOIN을 통해서 hour가 일치하는 테이블의 count를 뽑아냈고 null은 COLESCE로 처리하였다.
WITH T1 AS (
SELECT 0 AS HOUR UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9 UNION ALL
SELECT 10 UNION ALL
SELECT 11 UNION ALL
SELECT 12 UNION ALL
SELECT 13 UNION ALL
SELECT 14 UNION ALL
SELECT 15 UNION ALL
SELECT 16 UNION ALL
SELECT 17 UNION ALL
SELECT 18 UNION ALL
SELECT 19 UNION ALL
SELECT 20 UNION ALL
SELECT 21 UNION ALL
SELECT 22 UNION ALL
SELECT 23
)
SELECT T1.HOUR, COALESCE(B.COUNT, 0) AS COUNT
FROM T1
LEFT JOIN (
SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
) AS B
ON T1.HOUR = B.HOUR;
내 풀이의 문제점
만약 이렇게 0부터 9999까지의 범위가 주어진다면 이걸 무작정 9999로 하드 쿼리를 짤 수 없다.
나는 SQL의 SET명령어에 대해서 알게되었다.
SET 명령어는 어떤 사용자 정의 변수에 특정한 값을 할당할 때 쓰는건데 아래처럼 사용할 수 있다.
SET @변수이름 = 값; 혹은 SET @변수이름 :=값;
SELECT @변수이름 := 값;
SET이외의 명령문에서는 =가 비교연산자로 취급되기 때문에 :=를 사용한다.
따라서 아래와 같이 사용하면 0부터 23까지의 테이블을 뽑아낼 수 있다.
SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS HOUR
FROM ANIMAL_OUTS
WHERE @HOUR < 23;
HOUR 변수에 -1의 초기값을 할당한다음 +1씩 더해주면서 마지막에 HOUR가 22가 되었을 때 종료한다. (이때 HOUR값은 22이지만 SELECT문에서 +1을 해줬기 때문에 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;