dearbeany
[MySQL] 집계함수의 결과를 group by 없이 출력하기 (OVER) 본문
집계함수의 결과를 group by 없이 출력
- 평균(=집계함수)의 값을 내야하는데, 국가별로 대륙(continent)별로 두 개의 평균값을 출력해야 한다.
- '전세계 평균' => 국가별, 따로 그룹화할 기준 없음. (전체 gnp합) / (국가개수)
- '대륙 평균' => 대륙별, group by continent 해야 함. (대륙 별 gnp의 합) / (대륙의 개수)
- GROUP BY절을 사용할 경우 데이터가 변형된다! 따라서 사용X
- OVER 의 사용: GROUP BY 절을 사용하지 않고, 조회된 각 행에 그룹으로 집계된 값을 표시할 때 OVER 절과 함께 PARTITION BY 절을 사용하면 된다.
- 분석함수를 사용할 때는 OVER 절을 함께 사용해야 하며, OVER 절 내부에 PATITION BY 절을 사용하지 않으면 쿼리 결과 전체를 집계하며 PARTITION BY 절을 사용하면 쿼리 결과에서 해당 칼럼을 그룹으로 묶어서 결과를 표시한다.
분석함수([칼럼]) OVER(PARTITION BY 칼럼1, 칼럼2... [ORDER BY 절] [WINDOWING 절])
-- 12. country에서 국가별로 gnp와 함께 전세계 평균 gnp, 대륙 평균 gnp를 출력
-- 전세계 평균
select avg(gnp) as '전세계 평균'
from country;
-- 대륙 평균
select continent, avg(gnp) as '대륙 평균'
from country
group by continent;
-- group by 없이 집계함수 사용하기
-- (1) 서브쿼리 & over()
SELECT continent, name,
(SELECT AVG(gnp) FROM country) AS '전세계 평균',
AVG(gnp) OVER (PARTITION BY continent) AS '대륙 평균'
FROM country
ORDER BY continent;
-- (2) 둘 다 over() 사용
SELECT continent, name, gnp,
avg(gnp) over () as '전세계 평균',
avg(gnp) over (partition by continent) as '대륙 평균'
from country
order by continent;
결과 : 데이터 전체의 개수인 239개의 row가 출력된다.
'Web' 카테고리의 다른 글
[JDBC] 게시판 만들기 (3. DBUtil 클래스 생성 ~ 4. CRUD 완성 및 테스트) (1) | 2022.09.25 |
---|---|
[JDBC] JDBC의 작업순서 | 게시판 만들기 실습 (1.board 테이블 설계 ~ 2.Java 프로젝트 생성) (0) | 2022.09.25 |
[Bootstrap] ToDoList 스타일 꾸며보기 (0) | 2022.08.30 |
[ToDoList] 추가, 삭제 기능 구현 및 로컬스토리지 이용 (0) | 2022.08.30 |
[Youtube API] 검색어 입력으로 썸네일 이미지 받아오기 (0) | 2022.08.30 |