[SQL] 프로그래머스 SQL 고득점 Kit - GROUP BY

승민·2022년 1월 7일
0

Sql

목록 보기
3/5

💡 고양이와 개는 몇 마리 있을까?

어떤 종류의 개수를 알고 싶으면 그룹화를 해야한다. 특정 열을 그룹화할 때 사용하는 키워드가 GROUP BY이다. GROUP BY를 통해 특정 열의 같은 내용을 하나로 묶을 수 있다.

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) as count 
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

또한 특정 열을 추출할 때 as를 사용하면 as뒤에 있는 키워드로 결과가 출력된다. 문제에서 결과 테이블이 count로 되어 있어서 as count를 사용하였다.

💡 동명 동물 수 찾기

이 문제부터 살짝 복잡해지는 느낌을 받았다. 일단 구하고자 하는 것이 동물의 이름과 같은 이름을 가진 동물이 몇 마리인지 알아야 하므로 SELECT NAME, COUNT(NAME) as COUNT을 해주었고 동물의 이름을 GROUP BY로 묶었다. 또한 같은 이름을 가진 동물이 2마리 이상인 경우에만 출력을 해야 하기 때문에 조건 관련 키워드 HAVING을 사용했다. 여기서 왜 WHERE가 아닌 HAVING을 사용했는지 의문이 들 수 있는데 HAVING은 GROUP BY가 사용된 이후에 조건을 주고 싶을 때 사용하는 키워드이고 WHERE는 GROUP BY가 사용되지 않은 경우에 조건을 줄 수 있는 키워드이다.

SELECT NAME, COUNT(NAME) as COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME)>1
ORDER BY NAME ASC

💡 입양 시각 구하기(1)

이 문제를 해결하기 위해서는 새로운 함수인 HOUR를 사용해야 한다. HOUR(날짜)를 실행하면 결과로 날짜의 시각이 출력된다. 이는 HOUR 뿐만 아니라 YEAR, MONTH, DAY, MINUTE, SECOND 함수도 마찬가지이다.

SELECT HOUR(DATETIME) as HOUR, COUNT(DATETIME)as COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING 9<=HOUR AND HOUR<=19
ORDER BY HOUR

이 문제에서 헷갈렸던 부분은 GROUP BY를 한 이후에는 별칭으로 지정한 HOUR를 써주어야 한다. 근데 GROUP BY를 사용하기 전에 WHERE를 통해 조건을 거는 경우 HOUR가 아닌 HOUR(DATETIME)을 써주어야 오류가 안난다. 이 부분은 MySql의 문법적인 부분 때문이라고 한다.

💡 입양 시각 구하기(2)

위의 문제와 비슷한 건줄 알았는데 완전 새로운 개념이 필요한 문제이다. 표에 없는 부분까지 결과로 출력이 되어야 하기 때문인데, 나는 변수를 생성해서 문제를 해결하였다. sql에서 변수를 생성하는 키워드는 SET이다. 또한 변수 이름 앞에 @를 붙인다. 또한 초기화를 할 때는 =이 아닌 :=을 사용해야 한다. sql에서 =은 할당연산자가 아닌 수학에서처럼 등호로 쓰이기 때문이다.

SET @hour:=-1;
SELECT (@hour:=@hour+1) as HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME)=@hour)as COUNT
FROM ANIMAL_OUTS
WHERE @hour<23

또한 위의 코드처럼 변수를 생성하고 세미 콜론(;)을 붙여서 끝맺음을 해야 한다. 위의 코드를 간략히 설명하자면 hour라는 변수를 생성하고 -1을 초기화하였고, hour가 23 미만인 동안에 hour의 값이 1씩 증가하면서 HOUR(DATETIME)과 hour의 값이 일치하면 COUNT를 추출하는 방식이다.

profile
안녕하세요 승민입니다

0개의 댓글