[SQL]입양 시각 구하기(2) (GROUP BY)❌

Jaewon Lim·2025년 1월 16일
post-thumbnail

📝 문제 설명

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

Column NameTypeNullable
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_OUTCOMEVARCHAR(N)FALSE

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

📖 예시

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

HOURCOUNT
00
10
20
30
40
50
60
73
81
91
102
1113
1210
1314
149
157
1610
1712
1816
192
200
210
220
230

💻 코드

내코드

SELECT
    HOUR(DATETIME) AS 'HOUR',
    CASE
        WHEN HOUR(DATETIME) = 0 THEN COUNT(ANIMAL_ID) 
        WHEN HOUR(DATETIME) = 1 THEN COUNT(ANIMAL_ID)
        WHEN HOUR(DATETIME) = 2 THEN COUNT(ANIMAL_ID)
        WHEN HOUR(DATETIME) = 3 THEN COUNT(ANIMAL_ID)
        WHEN HOUR(DATETIME) = 4 THEN COUNT(ANIMAL_ID)
    END AS 'COUNT'
FROM  ANIMAL_OUTS
GROUP BY 'HOUR'
ORDER BY 'HOUR' 

정답코드

WITH hour_list AS (
    SELECT 0 AS HOUR UNION ALL
    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
    UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
    UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 
    UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 
    UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20 
    UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23
),
adoption_counts AS (
    SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
    FROM ANIMAL_OUTS
    GROUP BY HOUR(DATETIME)
)
SELECT 
    hl.HOUR,
    COALESCE(ac.COUNT, 0) AS COUNT
FROM hour_list hl
LEFT JOIN adoption_counts ac ON hl.HOUR = ac.HOUR
ORDER BY hl.HOUR;

🔍 분석

  1. CASE구문 순서 제대로 숙지!!!

CASE WHEN 조건식1 THEN 반환값
WHEN 조건식2 THEN 반환값

SELECT employee_id
     , first_name
     , job_id
     , CASE WHEN job_id = 13 THEN 'CLERK'
            WHEN job_id = 14 THEN 'MANAGER'
            ELSE 'N/A'
       END AS [job_title]
  FROM employees
 WHERe department_id IN (1, 3)
  1. 행이 없는 값들의 표현은 어떻게 하지?
  • 0시에 입양 보낸 동물이 없는데 시간은 표시를 해줘야돼. 어떻게 해줄 수 있을까
  • COALESCE 함수(NULL이 아닌 첫 번째 값 반환)를 사용해서 COUNT값이 NULL일 경우 0으로 대체하여, 모든 시간대에 데이터를 표현 할 수 있도록하자!!!!
- 
SELECT A, B, COALESCE(A,B) FROM table_a;
  1. UNION ALL을 사용하는 이유는?
  • UNION과 비교하여 중복된 값을 제거하지 않고 모든 값을 유지하며 결과를 더 빠르게 반환하기 때문이다.
  • 시간대를 생성할 때 0부터 23까지의 각각의 시간을 명시적으로 나타내야 하며, 이러한 각 값은 고유하므로 UNION ALL을 사용하여 불필요한 중복 제거 과정 생략

0개의 댓글