SQL

[My SQL] SET 함수 활용

김꾸준 2021. 12. 21. 06:31

 

 

 

출처 : 프로그래머스 코딩테스트 (https://programmers.co.kr/learn/challenges)

 

 

 

 

제시된 문제

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다.
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
00시부터 23시까지, 각 시간대 별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
이때 결과는 시간대 순으로 정렬해야 합니다.

 

1차 작성 답안

SELECT SUBSTR(DATETIME, 12, 2) AS HOUR, COUNT(ANIMAL_ID) AS CNT
FROM ANIMAL_OUTS
WHERE SUBSTR(DATETIME, 12, 2) BETWEEN 00 AND 23
GROUP BY HOUR
ORDER BY HOUR
<출력>

09	1
10	2
11	13
12	10
13	14
14	9
15	7
16	10
17	12
18	16
19	2

 

피드백

입양시각 데이터가 09시~19시만 존재하기 때문에 09시부터 출력되었으나 문제에 의하면 00시부터 출력되어야 함.
00시~08시까지 강제로 row를 생성해주기 위해 SET 함수를 사용해야 함.

 

SET 함수란?

사용자 정의 변수. 임의로 변수를 지정할 수 있음.
SELECT 절에 앞서 SET 함수를 쓰거나, SELECT 절을 활용하여 정의할 수 있음.

ex) 예시

SET @variable = 3;
또는 SET @variable := 3;
또는 SELECT @variable:=3;

 

SET 함수 활용한 2차 작성 답안

 

1) 시간대 출력 (0~23시)

SET @EVERY_HOUR := -1;
SELECT @EVERY_HOUR := @EVERY_HOUR + 1 AS HOUR
FROM ANIMAL_OUTS
WHERE @EVERY_HOUR < 23;

<출력>
HOUR
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

 

2) COUNT 출력 (SELECT문에 서브쿼리 활용)

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

<출력>

HOUR	COUNT
0	0
1	0
2	0
3	0
4	0
5	0
6	0
7	3
8	1
9	1
10	2
11	13
12	10
13	14
14	9
15	7
16	10
17	12
18	16
19	2
20	0
21	0
22	0
23	0

 

결과는 ?