프로그래머스 SQL 고득점 Kit - GROUP BY
1. 고양이와 개는 몇 마리 있을까
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/59040
문제 조건
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
문제 조건
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. 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
문제 조건
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. 이 문제를 보면서 처음 본 개념인데 이 정도까지 나올까 싶다?
'알고리즘 > 프로그래머스 - SQL 고득점 KIT' 카테고리의 다른 글
프로그래머스 SQL 고득점 Kit - String, Date (0) | 2021.10.15 |
---|---|
프로그래머스 SQL 고득점 Kit - JOIN (0) | 2021.10.14 |
프로그래머스 SQL 고득점 Kit - IS NULL (0) | 2021.10.13 |
프로그래머스 SQL 고득점 Kit - SUM, MAX, MIN (0) | 2021.10.11 |
프로그래머스 SQL 고득점 Kit - SELECT (0) | 2021.10.10 |
댓글