[테이블]
ANIMAL_OUTS
테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS
테이블 구조는 다음과 같으며, ANIMAL_ID
, ANIMAL_TYPE
, DATETIME
, NAME
, SEX_UPON_OUTCOME
는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | 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 |
이 문제는 3번 문제와 똑같이 하고 숫자만 바꿨는데….. 아니더라구요 ㅎㅎㅎ
HAVING 조건 없이 먼저 나오는 결과 값을 확인했습니다
그런데 7시부터 19시까지만 나오더라구요!!!(충격적)
프로그래머스만 나와서ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
참고했습니다!
몇몇 블로그를 찾아보았는데
UNION과 SET 이렇게 2가지 방법을 많이 사용하셨더라구요
저는 그럼 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가 같다고 해줘야 집계가 잘 되어서 나옵니다.
이번문제는 정말 힘들었네요….하핫
[참고 블로그]