RATIO_TO_REPORT( COLUMN ) OVER( PARTITION BY 절) 함수를 이용할 수 있습니다.
(*PARTITION BY 절은 없을 경우 빈 공간으로 생략가능)
RATIO_TO_REPORT(MONTH_TM) * 100 이라고 하면 전체 MONTH_TM을 SUM한 값 중 MONTH_TM이 몇 %를 차지하는지 알 수 있습니다.
또 PARTITION BY로 그룹을 지어주면 그룹별 %도 알 수 있습니다.
간단하게 쿼리로 결과를 알아보겠습니다.
WITH TESTDB AS(
SELECT '이승현' EMP_NM, 15 MILEAGE FROM DUAL UNION ALL
SELECT '이상천' EMP_NM, 12 MILEAGE FROM DUAL UNION ALL
SELECT '김희경' EMP_NM, 16 MILEAGE FROM DUAL UNION ALL
SELECT '김진철' EMP_NM, 8 MILEAGE FROM DUAL UNION ALL
SELECT '이대원' EMP_NM, 7 MILEAGE FROM DUAL UNION ALL
SELECT '박재욱' EMP_NM, 17 MILEAGE FROM DUAL
)
SELECT EMP_NM
, ROUND((RATIO_TO_REPORT(MILEAGE) OVER() * 100),2)||'%' MILEAGE
FROM TESTDB
;
TESTDB라는 테이블은 회원들의 마일리지를 저장하고 있다고 가정합니다.
(RATIO_TO_REPORT(MILEAGE) OVER() * 100)를 하고 ROUND 처리를 통해 소수점 두번째 자리까지 표시해보겠습니다.
결과를 통해 전체 마일리지 중 각 회원이 몇 퍼센트를 차지하는지 알 수 있습니다.
이번에는 PARTITION BY를 사용한 예를 알아보겠습니다.
WITH TESTDB AS(
SELECT '이승현' EMP_NM, '개발팀' DEPART_NM, 15 MILEAGE FROM DUAL UNION ALL
SELECT '이상천' EMP_NM, '개발팀' DEPART_NM, 12 MILEAGE FROM DUAL UNION ALL
SELECT '이대원' EMP_NM, '개발팀' DEPART_NM, 7 MILEAGE FROM DUAL UNION ALL
SELECT '김희경' EMP_NM, '마케팅팀' DEPART_NM, 16 MILEAGE FROM DUAL UNION ALL
SELECT '김재욱' EMP_NM, '마케팅팀' DEPART_NM, 11 MILEAGE FROM DUAL UNION ALL
SELECT '김진철' EMP_NM, '운영팀' DEPART_NM, 8 MILEAGE FROM DUAL UNION ALL
SELECT '손흥민' EMP_NM, '운영팀' DEPART_NM, 19 MILEAGE FROM DUAL UNION ALL
SELECT '박재욱' EMP_NM, '기획팀' DEPART_NM, 17 MILEAGE FROM DUAL UNION ALL
SELECT '임경훈' EMP_NM, '기획팀' DEPART_NM, 5 MILEAGE FROM DUAL
)
SELECT DEPART_NM
, EMP_NM
, ROUND(RATIO_TO_REPORT(MILEAGE) OVER(PARTITION BY DEPART_NM),2)*100||'%' MILEAGE
FROM TESTDB
;
PARTITION BY COLUMN을 하게 되면 COLUMN별로 차지하는 비율을 알 수 있습니다.
RATIO_TO_REPORT(MILEAGE) OVER(PARTITION BY DEPART_NM)을 해석하면 DEPART_NM별 마일리지의 백분율을 확인하는 것을 의미합니다.
참고로 본 함수는 SQL Server에서는 지원하지 않습니다.
+ 2018.11.27 추가 어제 롤업으로 총합이 보여지면 더 좋을 것 같다는 의견에 추가를 해봤습니다 :) 아래 주석 처리를 한 이유는 '%'가 문자로 이어져있어서 인라인뷰로 사용하기에는 문제가 있었기 때문입니다. GROUP BY절에 롤업을 사용해서 소계를 구해봤습니다.
SELECT X.DEPART_NM
, X.EMP_NM
, SUM(X.MILEAGE)||'%' AS TOTAL_MILEAGE
FROM (
SELECT DEPART_NM
, EMP_NM
--, ROUND(RATIO_TO_REPORT(MILEAGE) OVER(PARTITION BY DEPART_NM),2)*100||'%' MILEAGE
, ROUND(RATIO_TO_REPORT(MILEAGE) OVER(PARTITION BY DEPART_NM),2)*100 AS MILEAGE
FROM TESTDB
) X
GROUP BY ROLLUP(DEPART_NM, EMP_NM)
(회원별 마일리지 / 총 합계) * 100
두번째로 기본적인 백분율을 구하는 방법을 사용할 수 있습니다.
WITH TESTDB AS(
SELECT '이승현' EMP_NM, '개발팀' DEPART_NM, 15 MILEAGE FROM DUAL UNION ALL
SELECT '김희경' EMP_NM, '마케팅팀' DEPART_NM, 16 MILEAGE FROM DUAL UNION ALL
SELECT '김진철' EMP_NM, '운영팀' DEPART_NM, 8 MILEAGE FROM DUAL UNION ALL
SELECT '박재욱' EMP_NM, '기획팀' DEPART_NM, 17 MILEAGE FROM DUAL
)
SELECT T1.DEPART_NM
, T1.EMP_NM
, ROUND((T1.MILEAGE/T2.TOTAL_MILEAGE)*100,2)||'%' MILEAGE
FROM TESTDB T1
, (SELECT SUM(MILEAGE) TOTAL_MILEAGE
FROM TESTDB
) T2
;