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
;