데이터로그😎
[윈도우 함수] SUM() OVER() 본문
아래 문제를 통해 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 |