본문 바로가기
알고리즘/프로그래머스 - SQL 고득점 KIT

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

by 호롤롤로루야 2021. 10. 12.

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

1. 고양이와 개는 몇 마리 있을까

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/59040

 

코딩테스트 연습 - 고양이와 개는 몇 마리 있을까

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

문제 조건

1. 동물 보호소에 들어온 동물 고양이와 개가 각각 마리인지 조회하는 SQL문을 작성해주세요.

2. 이때 고양이를 개보다 먼저 조회해주세요.

쿼리

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

풀이

1. 고양이와 개에 대해 따로 count를 하기 위해 GROUP BY ANIMAL_TYPE 을 사용했다.

2. 고양이(Cat)이 개(Dog) 보다 먼저 조회되어야 하므로 ORDER BY ANIMAL_TYPE 을 사용했다.

3. GROUP BY(컬럼명) : 컬럼 내에서 같은 값끼리 묶어서 그룹화 한다.

   . GROUP BY를 사용할 때 주의할 점

      1. GROUP BY 컬럼 외에 다른 컬럼을 SELECT에 사용하려면 집계함수(SUM, MAX, MIN, AVG)와 함께 사용한다.

      2. GROUP BY 컬럼 외에 다른 컬럼을 그냥 사용하면 에러가 발생한다.

         . 어떤 GROUP에 속하는 값은 여러개가 있을 수 있다. 이 때 어떤 값을 출력해야하지 불확실 하기 때문이다.

         . 아래처럼 무지성으로 Sugar나 Harley가 매핑이 된다. (원래는 오류가 나야한다.)

2. 동명 동물 수 찾기

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/59041

 

코딩테스트 연습 - 동명 동물 수 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

문제 조건

1. 동물 보호소에 들어온 동물 이름 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요.

2. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

쿼리

SELECT NAME, COUNT(NAME) AS COUNT FROM ANIMAL_INS 
GROUP BY NAME 
HAVING COUNT(NAME) > 1
ORDER BY NAME;

풀이

1. 같은 이름을 사용하는 동물의 수를 찾기 위해 GROUP BY NAME 을 사용했다.

2. 중복된 이름만 출력하기 위해 GROUP BY에 대한 조건문 HAVING COUNT(NAME) > 1을 사용한다.

3. HAVING : GROUP BY에서 생성되는 GROUP에 조건 적용

   . WHERE 과의 차이점 : WHERE는 전체 행에 대해 적용 

3. 입양 시각 구하기(1)

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/59412

 

코딩테스트 연습 - 입양 시각 구하기(1)

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

문제 조건

1. 09:00부터 19:59까지, 시간대별로 입양이 건이나 발생했는지 조회하는 SQL문을 작성해주세요.

2. 이때 결과는 시간대 순으로 정렬해야 합니다.

쿼리

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT' 
FROM ANIMAL_OUTS 
GROUP BY HOUR(DATETIME)
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR(DATETIME);

 

SELECT HOUR(DATETIME) AS 'HOUR', COUNT(*) AS 'COUNT' 
FROM ANIMAL_OUTS 
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);

풀이

1. 09:00 ~ 19:59 사이에 각 시간대별 입양 건수를 세기 위해 GROUP BY HOUR(DATETIME) 을 사용한다.

   . HOUR(DATETIME) : DATETIME 형식에서 "시간"만 추출한다.

2. 9부터 19까지의 시간대만 사용하므로 BETWEEN 9 AND 19 를 사용한다.

3. 이 문제는 위와 같이 HAVING 혹은 WHERE로 구현할 수 있다.

4. HAVING 에서는 WHERE과 달리 HOUR 까지만 써서 조건을 적용한다. (HOUR(DATETIME)으로 쓰면 틀림)

5. 시간대 순으로 정렬하기 위해 ORDER BY HOUR(DATETIME) 을 사용한다.

6. DATETIME 추출 종류   

   . YEAR(년), MONTH(월), DAY(일), HOUR(시), MINUTE(분), SECOND(초)

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

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/59413

 

코딩테스트 연습 - 입양 시각 구하기(2)

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

문제 조건

1. 0시부터 23시까지, 시간대별로 입양이 건이나 발생했는지 조회하는 SQL문을 작성해주세요.

2. 이때 결과는 시간대 순으로 정렬해야 합니다.

쿼리

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;

풀이

1. 값이 없는 시간대까지 출력해야하므로 로컬 변수 @HOUR를 사용한다.

   . HOUR는 0부터 시작 되기 때문에 초기값을 -1로 둔다.

   . := 는 대입 연산자이다. 비교 연산자인 = 과 구분된다.

   . SET @변수명 := '값';

2. (@HOUR := @HOUR + 1) 은 다음 row 조회 시 @HOUR에 1을 더해준다.

3. 서브쿼리 내에서 HOUR(DATETIME)과 같은 경우를 count

4. @HOUR는 23까지 증가시킨다.

5. 이 문제를 보면서 처음 본 개념인데 이 정도까지 나올까 싶다?

댓글