오랑우탄의 반란

프로그래머스 | 입양 시각 구하기(2) - SET 함수 (MySQL) 본문

SQL/프로그래머스

프로그래머스 | 입양 시각 구하기(2) - SET 함수 (MySQL)

5&2 2024. 7. 8. 17:39
반응형

오늘도 오랑이는 문제를 풉니다.

 

기존 입양 시각 구하기 1 문제와 동일한 대신, HOUR 가 0~23까지 전부 표시되는 형식으로 출력되게 하는 문제입니다. 

푸는 방법을 몰라서 오늘도 열심히 구글링 해봅니다. 

 

입양 시각 구하기(2)

 

우선 기존 코드는 아래와 같습니다. 간단하죠?

이렇게 하면 HOUR 가 7~19인 값에 대해서만 출력이 됩니다. IFNULL 을 사용해서 값이 없을 때 0으로 표시되도록 쿼리를 짜도, 애초에 HOUR 값이 없기 때문에 최종 결과물에 표시되지 않는 것을 보실 수 있습니다. 

SELECT HOUR(DATETIME) AS HOUR, IFNULL(COUNT(1),0) AS COUNT
FROM ANIMAL_OUTS
GROUP BY 1
ORDER BY 1

 

그렇기 때문에 해당 문제를 풀기 위해서는 파이썬에서 자주 사용하는 변수 선언 방식을 쿼리의 SET 함수로 풀어내야 합니다.

HOUR 칼럼에 대해 0~23 까지의 숫자가 나오려면, 고정값을 지정해주고 한계값까지 하나씩 증가하게 설정해야 합니다. 

@HOUR 를 0으로 설정하면 HOUR += 1 일 때 1부터 시작되기 때문에 HOUR = -1 로 변수를 지정해줍니다. 

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

 

SELECT 문에서는 위에서 지정한 변수에 대해 += 1 식의 재정의가 필요하기 때문에 @HOUR := @HOUR + 1 로 표기합니다. 그리고선 COUNT 값을 넣으면 되는데, HOUR(DATETIME) 값이 위에서 지정한 @HOUR 변수값과 일치하는 경우 COUNT 하게끔 서브쿼리를 작성합니다. 

처음 쿼리에서처럼 IFNULL 을 사용하지 않은 이유는 COUNT 함수는 정수만 출력하기 때문에 아닌 값에 대해 0이 나와서 굳이 필요하지 않습니다.  

마지막으로 WHERE 절에서 제한을 걸어줍니다. 

 


 

SET 함수에 대해서 간단히 알아봅시다. 

 

SET 함수 

문법

변수명 앞에 @ 표시와 변수 지정 끝에 ; 표기는 필수이며, 값 지정에 대해서는 = 또는 := 모두 가능합니다. 

다만 SELECT 문에서 변수에 대해 추가적으로 값을 지정할 시, 무조건 := 를 사용해야 합니다.

(SET 외의 명령문에서는 = 이 비교연산자로 취급되기 때문)

SET @변수명 = 값 ; OR SET @변수명 := 값 

SELECT @변수명 ;
SELECT @변수명 := 값 ;

 

사용 예시

단순한 숫자열 값이어도 되고 서브쿼리여도 가능합니다. 

SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);

 

 

 

반응형