[프로그래머스 SQL 고득점 Kit] GROUP BY(4)

손은영·2022년 8월 11일
0

SQL

목록 보기
5/8
post-thumbnail

4. 입양 시각 구하기(2)

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

NAMETYPENULLABE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(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




이 문제는 3번 문제와 똑같이 하고 숫자만 바꿨는데….. 아니더라구요 ㅎㅎㅎ

HAVING 조건 없이 먼저 나오는 결과 값을 확인했습니다
그런데 7시부터 19시까지만 나오더라구요!!!(충격적)


'mysql 0시부터'라고 검색했더니

프로그래머스만 나와서ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

참고했습니다!


몇몇 블로그를 찾아보았는데

UNION과 SET 이렇게 2가지 방법을 많이 사용하셨더라구요

저는 그럼 SET방법으로 한번 정리해보겠습니다!


SET

사용자 정의 변수 선언 및 초기화

SET @변수이름 = 대입값; or SET @변수이름 := 대입값;
SELECT @변수이름 := 대입값;

SET 이외의 명령문에서는 = 이 비교연산자로 작용하기 때문에 SELECT 문에서는 := 이것을 사용합니다!

저희 문제에 한번 대입해볼게요

SET @HOUR = -1;
SELECT (@HOUR := @HOUR + 1) AS HOUR
FROM ANIMAL_OUTS;

출력한 결과 엄청 많이 나오네요;


ANIMAL_OUTS의 행의 개수가 100개여서 100개의 결과가 나온다고 합니다.

저희는 23까지 필요하니까 WHERE절로 조건을 걸어야겠네요

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

이제 예시대로 완성해봅시다
SET @HOUR = -1;

SELECT (@HOUR := @HOUR + 1) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23

흠….아닌가보네요

그러면

SET @HOUR = -1;

SELECT (@HOUR := @HOUR + 1) AS HOUR, 
	(SELECT COUNT(HOUR(DATETIME))
	FROM ANIMAL_OUTS
	WHERE HOUR(DATETIME) = @HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23

SELECT절을 한번 더 써서 HOUR(DATETIME) 과 @HOUR가 같다고 해줘야 집계가 잘 되어서 나옵니다.



이번문제는 정말 힘들었네요….하핫






[참고 블로그]

[MySQL] 입양 시각 구하기(2)

[삼쾌한 IT강의] MySQL 변수 종류 및 사용법

profile
정글에서 살아남기

0개의 댓글