mysql 문제풀이/문제 제대로 읽기

프로그래머스 Lv 4 - 입양 시각 구하기(2)

gooreumsea 2023. 7. 5. 23:43

쉬울 줄 알았는데, 어려운 문제

 

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

 

습득한 점:

쉬운 줄 알았는데, 생각보다 어려운 문제였다. SET함수를 활용해 본적이 없었어서 그랬을 수도 있다.

풀이법을 외워버리면 될 것 같다. 이 문제를 통해 SET함수를 실제로 활용해 볼 수 있었음.

이 또한 With 구문으로 풀어볼려고 했지만, With 구문에 테이블 이름을 끌어옴을 명시하는데 있어서, 표기하기가 난해했다.

(내가 아직 부족한 걸 수도!!)

 

 

문제:

문제:

0시부터 23시까지, 각 시간대 별로 입양이 총 몇 건 일어났는지 파악하는 쿼리 작성.

결과는 시간대순으로 정렬.

 

 

 

문제파악:

열심히 case구문으로 풀었는데, 답이 나오지 않아 문제를 잘 살펴 보았더니
정답지에는 입양이 일어나지 않는 시간또한 나타나 있었다.
가령 0시 32분에 입양된 기록이 없다면, count=0으로 표시되어

hour count
0 0
1 0
2 3

 으로 표시되는 식이었다.

나의 쿼리는 당연히 입양이 일어난 시각만 셀 수 있도록 작성되어 있었다.

 

데이터베이스에는 없는 시간을 만드는 다른 방법을 생각해야만 했고,

SET 함수를 활용했다.

 

* SET함수의 경우, 어떤 변수에 특정 값을 넣어줄 때 사용한다. @와 변수명을 함께 사용하고,
* SET @HOUR = -1; 는, HOUR 변수 값을 -1 로 초기화 해주는 것과 같다.

다른 파이썬이나 자바에서의 변수초기화와 같다고 생각하면 될 것 같다.

* := 기호는 대입 연산자의 개념이다. HOUR = HOUR +1 >>> 우측에 계산된 값으로 좌측 값을 덮어 씌우는 형식.

 

* WHERE @HOUR < 23; 의 경우, 반복을 0부터 22까지 총 23번 한다고 생각하면 된다.

 

* 또한 아래 코드를 삽입해서, 

WHERE 조건에서 @HOUR 변수와 HOUR(DATETIME)의 값이 서로 같을때를 카운트하는 쿼리를 SELECT의 두번째 인자로 삽입한 뒤, COUNT라는 Alias를 붙인다.

(SELECT COUNT(*) 
FROM ANIMAL_OUTS 
WHERE HOUR(DATETIME) = @HOUR) AS COUNT

 

* @HOUR변수와 @HOUR(DATETIME)로 나타낸 시간이 같을 때를 카운트 하기때문에,

@HOUR(DATETIME)과 @HOUR변수 테이블이 순차적으로 함께 만들어지며 COUNT 더해나간다.

 

 

풀이: SET을 활용하는 쿼리를 작성 할때,    := 및 ;의 사용에 반드시 주의해야할 것 같다.

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