[SQL] SQL 고득점 Kit - GROUP BY

Updated:


최댓값 구하기

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

동명 동물 수 찾기

SELECT NAME, COUNT(NAME) "COUNT" FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME ASC;

입양 시각 구하기(1)

SELECT HOUR(DATETIME) "HOUR", COUNT(DATETIME) "COUNT" FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR(DATETIME) >= 9 AND HOUR(DATETIME) < 20
ORDER BY HOUR(DATETIME) ASC;
  • 위와 같이 작성 했더니 오류나는 이유

    SQL 실행 중 오류가 발생하였습니다. Unknown column ‘DATETIME’ in ‘having clause’ HAVING 조건을 걸 때는 순수한 column을 써줘야 한다!!

  • 따라서 WHERE 조건 절로 변경
SELECT HOUR(DATETIME) "HOUR", COUNT(DATETIME) "COUNT" FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) < 20
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME) ASC;
  • 또는 HOUR(DATETIME)에 새로운 alias를 붙여 사용
SELECT HOUR(DATETIME) "HOUR", COUNT(DATETIME) "COUNT" FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR >= 9 AND HOUR < 20
ORDER BY HOUR(DATETIME) ASC;

입양 시각 구하기(2)

  • 이렇게 푸니깐 틀렸다. 왜냐하면 문제는 0~23시의 입양 보낸 동물 수를 count 하는 거였는데 아래처럼 풀면 모든 시간이 다 안나온다.
SELECT HOUR(DATETIME) "HOUR", COUNT(HOUR(DATETIME)) "COUNT" FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR >= 0 AND HOUR <= 23
ORDER BY HOUR ASC;
  • 검색해보니 새로 로컬 변수를 정의해주어 0~23시를 생성해 변수와 테이블의 HOUR가 같을때 COUNT 하도록 해야했다. // 아니면 테이블 하나 임의로 생성해서 join

  • 로컬 변수 생성은 한번도 안해봐서 어려웠다…

SET @HOUR := -1;

SELECT (@HOUR := @HOUR + 1) "HOUR", 
    (SELECT COUNT(HOUR(DATETIME)) 
     FROM ANIMAL_OUTS
     WHERE HOUR(DATETIME) = @HOUR
    ) "COUNT" 
FROM ANIMAL_OUTS
WHERE @HOUR < 23;

정리

  • 날짜 데이터에서 일부만 추출하기
    • YEAR(기준 날짜)
    • MONTH(기준 날짜)
    • DAY(기준 날짜)
    • HOUR(기준 날짜)
    • MINUTE(기준 날짜)
    • SECOND(기준 날짜)
  • 로컬 변수 생성

참고

출처: 프로그래머스 SQL 고득점 Kit

Leave a comment