데이터로그😎

[윈도우 함수] SUM() OVER() 본문

SQL/MySQL

[윈도우 함수] SUM() OVER()

지연v'_'v 2023. 9. 6. 20:37

아래 문제를 통해 OVER() 함수에 대해 알아보자.


2023년 4월 기준 전국 주요 시/도의 연령대별 인구수 합계를 구하고, 연령대별 인구 비율 구하기

step1 :2023년 4월 기준 전국 주요 시/도의 연령대별 인구수 합계를 구하기

SELECT AGRDE_SE_CD, sum(POPLTN_CNT) pop_cnt
FROM tb_popltn
WHERE ADMINIST_ZONE_NO LIKE '__00000000'
AND POPLTN_SE_CD = 'T'
AND STD_MT = '202304'
GROUP BY AGRDE_SE_CD
ORDER BY AGRDE_SE_CD;

 

 

 

step2: step1의 테이블을 from 절에 subquery로 놓고 sum() over()를 사용해 집계.

** sum(pop_cnt) over() : pop_cnt 컬럼의 전체 합을 구할 수 있다.

SELECT *, pop_cnt/pop_total as pop_ratio
FROM 
(SELECT *, SUM(pop_cnt) OVER() as pop_total
FROM (SELECT AGRDE_SE_CD, sum(POPLTN_CNT) as pop_cnt
FROM tb_popltn
WHERE STD_MT = '202304'
AND ADMINIST_ZONE_NO LIKE '__00000000'
AND POPLTN_SE_CD = 'T'
GROUP BY AGRDE_SE_CD
ORDER BY AGRDE_SE_CD) A) B;

 SUM() OVER()가 뭔데?

SUM()은 주어진 열의 값을 합하는 데 사용되며 OVER()가 함께 사용될 때 윈도우 함수로 동작한다.

SUM() 함수를 OVER() 절과 함께 사용하면 특정 윈도우(ex. 파티션 or 순서) 내에서 합계를 계산할 수 있다. 

여기서는 OVER() 안에 PARTITION BY나 ORDER BY 등을 사용하지 않았기에 pop_cnt 컬럼 전체의 합이 산출된 것.

 

자, 여기서 다시 한 번 예시를 들어볼까?

아래는 도시별 인구에 대한 표이다.

 

이 표로부터 국가별 인구 수 합계를 알고싶다면?? SUM() OVER()를 사용하면 된다.

SELECT * ,SUM(Population) OVER(PARTITION BY CountryCode) as country_pop
FROM city;

위의 표를 확인해보면 국가코드 별로, 즉 국가 별로 인구 수(population)의 합계인 country_pop 열이 생긴 것을 볼 수 있다.

만약.. 각 도시의 인구가 국가 전체에서 몇 %를 차지하는지 알고싶다면?

위의 쿼리를 subquery로 사용하면 되겠지?

 

SELECT *, Population/country_pop as pop_ratio
FROM (
		SELECT * ,SUM(Population) OVER(PARTITION BY CountryCode) as country_pop
		FROM city) A;

이전에 산출했던 쿼리를 from 절에 넣고, Population/country_pop 식을 SELECT 절에 추가하면, tada~~

전체 국가에서 각 도시의 인구가 차지하는 비율을 알 수가 있다!

'SQL > MySQL' 카테고리의 다른 글

REPLACE, SUBSTR, LPAD, TRIM  (0) 2023.09.08
Null과 공백의 차이 & Null값의 처리  (0) 2023.09.08
서브 쿼리  (0) 2023.09.06
ERD 표기법  (0) 2023.09.06
python - mysql 연결  (0) 2023.09.06