반응형

문제 설명

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

 

NAME TYPE NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N) FALSE
DATETIME DATETIME FALSE
NAME VARCHAR(N) TRUE
SEX_UPON_OUTCOME VARCHAR(N) FALSE

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

 

예시

SQL문을 실행하면 다음과 같이 나와야 합니다.

 

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

다른 문제들과 달리 레벨4 라 조금 어려웠고, 새로운 이론도 알 수 있었던 문제였다.

 

방법 1. UNION  함수 사용

- UNION 이란?

  • 2개 이상의 쿼리를 결합할 때 사용
    • UNION : 결합 시 중복 제거 
    • UNION ALL : 결합 시 중복 제거 X

- 해결 방법

 

  • 0~23시 모든 시간에서, 
    해당 시각에 입양된 기록이 없어도(NULL 이어도) COUNT 0으로 출력하는 것이 관건

  • UNION으로 0~23 모든 시간을 가진 TABLE을 생성 후
    여기에 LEFT JOIN과 IFNULL을 사용해 문제 해결

SELECT H1.HOUR, IFNULL(OUTS.COUNT,0) AS COUNT 
FROM ( 
    SELECT 0 AS HOUR 
    UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 
    UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 
    UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
     UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 
     UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 
     UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 ) H1 
     LEFT JOIN ( 
         SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT' 
         FROM ANIMAL_OUTS 
         GROUP BY HOUR) AS OUTS ON H1.HOUR = OUTS.HOUR

 

 

 

 

방법 2. 변수 사용

- 0 ~ 23 시 모든 HOUR을 출력하기 위해 변수 사용

 

- MySQL 변수 선언 방법

  • SET @변수명 = '값';   => " = " : MySQL에서 대입연산자, 비교연산자 로 사용됨(SET 명령어에서만 대입 연산자로 인식)

  • SET @변수명 := '값';  => " := "

  •  

  • SET을 제외한 다른 쿼리문(SELECT 등)은 '=' 를 비교연산자(comparison operator)로 인식하기 때문에, SET이 아닌 쿼리문에서는 반드시 대입 연산자(assignment operator) ':='을 사용

- 해결 방법

  • SET으로 HOUR_LIST라는 변수 선언하고 +1 씩 하며 0 ~ 23시 까지 모든 시간에 대한 COUNT 출력

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

 

반응형

'Database Study > SQL' 카테고리의 다른 글

[SQL]Join VS Union  (0) 2020.05.26
[MySQL] CASE, COALESCE, IFNULL NULL 처리  (1) 2020.03.11
[Oracle DB]Join 종류  (0) 2020.01.06
[Oracle DB] 커서 (CURSOR)  (0) 2020.01.06
[Oracle DB]PL / SQL 기초  (0) 2020.01.06

+ Recent posts