[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(기준 날짜)
- 로컬 변수 생성
Leave a comment