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
결과는 ?