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

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

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