Database/Oracle

[Oracle]백분율 구하기

  • -
반응형

백분율을 구해야 할 때 2가지 방법을 이용할 수 있습니다. 

RATIO_TO_REPORT() OVER() 함수

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
;


+피드백은 언제나 환영입니다 :)

반응형
Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.