Computer Science/자료구조와 알고리즘

[프로그래머스\SQL 고득점 kit] GROUP BY - 입양 시각 구하기(1) 풀이 3가지 mysql

BS Kwak 2021. 12. 18. 15:11

3. 입양시각 구하기 - HOUR로 시간 추출

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

(sol 1) HAVING절 사용! 

SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR>=9 AND HOUR<20
ORDER BY HOUR

1. HOUR(DATETIME)를 사용하면 "2021.12.18 13:07:12" 로 되어있는 datetime(날짜+시간) format에서 Hour에 해당하는 "13"만 뽑아 낼 수 있다!

따라서  HOUR(DATETIME)과 COUNT(DATETIME)의 각 컬럼명을 HOUR, COUNT로 조회!

SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT

 

2. FROM ANIMAL_OUTS(테이블 선택)

 

3.  HOUR 에 따라 그룹화 -> GROUP BY HOUR

여기서 HOUR(DATETIME)해도 되고 HOUR만 해도 된다! -> select절에서 HOUR(DATETIME)을 HOUR로 정의해주었기 때문! 

 

4. 그룹화한 후, 조건을 걸어준다 9시이후 20시미만. -> HAVING HOUR>=9 AND HOUR<20

조건이 2개이므로 AND로 연결해주면 된다

 

5. 마지막으로 HOUR에 따라 정렬 -> ORDER BY HOUR

 

(sol 2) WHERE 절 사용! 

참고로 HAVING 과 WHERE 의 차이는( https://bskwak.tistory.com/234 ) 여기서 확인할 수 있다!

SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME)>=9 AND HOUR(DATETIME)<20
GROUP BY HOUR
ORDER BY HOUR

1. (sol 1)과 동일하게  HOUR(DATETIME)를 사용

SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT

 

2. FROM ANIMAL_OUTS(테이블 선택)

 

3. 그룹화 하기 전에, 미리 조건을 걸어준다! 

WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME)<20

** 여기서는 HOUR(DATETIME)을 꼭! 써주어야 한다! HOUR로만 쓰게 되면,

"Unknown column 'HOUR' in 'where clause' " 라는 에러 발생 

꼭 WHERE 절에 HOUR(SELECT 에서 alias 사용한 단어)로 쓰고싶다면, -> (sol 3) 참고 

 

4.  HOUR 에 따라 그룹화 -> GROUP BY HOUR

여기서 HOUR(DATETIME)해도 되고 HOUR만 해도 된다! -> select절에서 HOUR(DATETIME)을 HOUR로 정의해주었기 때문! 

 

5. 마지막으로 HOUR에 따라 정렬 -> ORDER BY HOUR

 

(sol 3) WHERE 절에 alias 사용

SELECT *
FROM (SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
      FROM ANIMAL_OUTS
      GROUP BY HOUR
      ORDER BY HOUR) AS t
WHERE HOUR>=9 AND HOUR<20

 

즉, 하나의 질의문을 FROM절에 넣을 서브쿼리로 작성한 후에 감싸고 있는 query에서 SELECT절에서 서브쿼리의 alias를 사용하여주면,  WHERE절에서 해당 alias 단어 사용 가능

(서브 쿼리문) HOUR로 그룹화하고 정렬한 테이블 중 HOUR와 COUNT 컬럼으로 조회한 테이블 -> t alias 사용하여 지정