쉬울 줄 알았는데, 어려운 문제
링크: 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;
'sql > 문제 제대로 읽기' 카테고리의 다른 글
프로그래머스 Lv 4 - 취소되지 않은 진료 예약 조회하기 (0) | 2023.07.11 |
---|---|
프로그래머스 Lv1 - 조건에 부합하는 중고거래 댓글 조회 (0) | 2023.06.26 |