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

Kim Yuhyeon·2022년 5월 7일
0

SQL 

목록 보기
3/21

문제


https://programmers.co.kr/learn/courses/30/parts/17044

컬럼 그룹화


GROUP BY

AS 값 적용

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
  • 동물 보호소에 들어온(FROM ANIMAL_INS) 동물 중
  • 고양이와 개가 각각(GROUP BY ANIMAL_TYPE)
  • 몇 마리인지(COUNT(ANIMAL_TYPE))
  • 조회하는(SELECT) SQL문을 작성하라.
    -> 이 때, 고양이를 개보다 먼저(ORDER BY) 조회하라.
    -> c가 d보다 사전순으로 앞서 있으므로
    ORDER BY 의 default값인 ASC로 설정.

집계

HAVING

SELECT 컬럼 
FROM 테이블 
GROUP BY 그룹화할 컬럼 
HAVING 조건식;
SELECT NAME, COUNT(NAME) AS COUNT 
FROM ANIMAL_INS 
GROUP BY NAME
HAVING COUNT > 1
ORDER BY NAME
  • NAME으로 GROUP BY (GROUP BY NAME)
  • 이름의 수가 2 이상인 것 (HAVING COUNT > 1)
  • NAME 기준으로 오름차순 정렬 (ORDER BY NAME)

WHERE은 그룹화 하기 전 조건, AS 값 안먹음
HAVING은 그룹화 후에 조건

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

날짜 데이터에서 일부만 추출하기


아래에 MySQL 함수들은 날짜 데이터에서
일부만을 추출할 수있습니다.

YEAR : 연도 추출
MONTH : 월 추출
DAY : 일 추출 (DAYOFMONTH와 같은 함수)
HOUR : 시 추출
MINUTE : 분 추출
SECOND : 초 추출

SET, 서브쿼리


SET

어떠한 변수에 특정한 값을 넣어줄 때 사용

  • @는 변수명 앞에 넣어주어야한다.
    즉, @HOUR=-1이라는 것은
    HOUR 변수에 -1을 넣어준다는 뜻이다.
  • 다음으로 :=기호는 대입해준다는 뜻이다.
    즉, 기존 HOUR 변수는 -1인데
    그 HOUR 변수를 +1로 대입해준다는 뜻으로
    0이되고 또 0이 +1이 대입되어 1이 되면서
    WHERE절인 23미만일때까지 대입되어 22가 될때 멈추며
    22는 23이 된다.

0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
이때 결과는 시간대 순으로 정렬해야 합니다.
-> 데이터베이스에 없는 0부터 23시까지를 만들어야한다.

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

서브쿼리

다음으로 해결할 것은 COUNT한 테이블을 만들어주는 것이다.
HOUR 변수와 시간이 같을 때(HOUR(DATETIME) =@HOUR) 카운트한다.

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;

💡 참고 포스팅


0개의 댓글