2010년 4월 10일 토요일

오라클 분석함수(ratio_to_report)를 사용하여 비율 구하기 (퍼센트)

http://blog.naver.com/tyboss?Redirect=Log&logNo=70043043176


[출처] 오라클 분석함수(ratio_to_report)를 사용하여 비율 구하기 (퍼센트)|작성자 마루아라

RATIO_TO_REPORT


문법

ratio_to_report::=

그림 설명


참 조 :

"Analytic Functions " for information on syntax, semantics, and restrictions, including valid forms of expr


목적

RATIO_TO_REPORT함수는 분석 함수이다. 이 함수는 값의 세트의 합에 대한 값의 비율을 계산한다. 만약 expr이 NULL이라면, ratio-to-report값은 NULL이다.

값의 집합은 query_partition_clause에 의해서 정해진다. 만약 이 구문을 생략한다면, ratio-to-report는 쿼리에 의해 반환되는 모든 열에 의해 계산된다.

expr에 대해서는 RATIO_TO_REPORT 또는 임의의 다른 분석 함수를 이용할수 없다. 중첩 분석 함수는 이용할수 없으나, 다른 내장 함수를 이용할수 있다.

참고

http://www.elancer.co.kr/eTimes/page/eTimes_view.html?str=c2VsdW5vPTYxMg==


예제

다음 예제는 모든 사무원의 급여의 합계에 대한 각 사무원의 급여의 비율 값을 계산한다.

SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr
FROM employees
WHERE job_id = 'PU_CLERK';

LAST_NAME SALARY RR
------------------------- ---------- ----------
Khoo 3100 .223021583
Baida 2900 .208633094
Tobias 2800 .201438849
Himuro 2600 .18705036
Colmenares 2500 .179856115

 

 

테이블 table_123에서 점이 1100인 것의

select mngbr, cifno, jikwonno, janamt
, row_number() over(partition by jikwonno order by mngbr, cifno ) accum -- 직원별 순차번호
, sum(janamt) over(partition by jikwonno order by mngbr, cifno rows between unbounded preceding and current row) accum1
-- 점,직원별/ 고객번호순 잔액의 누적
, sum(janamt) over(partition by jikwonno) accum_tot -- 점,직원별 잔액의 합계
, round(ratio_to_report(janamt) over(partition by jikwonno) * 100, 2) ratio_tot -- 점,직원별 잔액이 차지하는 비율
from table_123
where mngbr = 1100

 

 

 

  References

  1. Oracle Database SQL Reference 10g Release 2 (10.2) Part Number B14200-02
  - http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/functions124.htm

 

  2. 출처

  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=352&page=2&position=2

 

 

==========================================================================================================================

==========================================================================================================================

 

http://www.oracleclub.com/article/44234

 

테이블에  금액/갯수 해서 저장하는 금액 컬럼 과 금액/갯수해서 나온 각각의 비율을 저장하는 컬럼이 있씁니다
금액 컬럼은 정수만 들어가고요..
비율을 소수점 2째자리까지 들어 갑니다
금액은 금액/갯수 해서 소숫점이 나오면 .. 소수점을 제거 하고
정수만 모두 더한후 원래의 금액이 될대까지 1원씩 루프를 돌면서 더합니다
밑에 처럼요...
select 90922255/3 from dual  -- 30307418.3333333
select 30307418 + 30307418 + 30307418 from dual  -- 90922254
select 30307419 + 30307418 + 30307418 from dual  -- 90922255  -- 100 으로 맟추기 위해서 1번째 것에 1을 더함

그럼 금액은 맞아지는대요...

위에서 구한 금액에 맞게 각각의 비율을 구해야 하는대... 비율을 소수점 2째자리까지 계산할수 있씁니다.
이런건 밑에 2가지 경우중 어떤게 맞는 건가요?


1번째 :

select  ((90922255/3)/90922255)*100 from dual  -- 33.3333333333333

select 33.33 + 33.33 + 33.33 from dual  -- 99.99

select 33.34 + 33.33 + 33.33 from dual  -- 100 으로 맟추기 위해서 1번째 것에 1을 더함

2번째 :

select  ((90922255/3)/90922255)*100 from dual  -- 33.3333333333333

select 33 + 33 + 33 from dual  -- 99

select 34 + 33 + 33 from dual   -- 100 으로 맟추기 위해서 1번째 것에 1을 더함

 

-------------------------------------------------------------------------------------------------------------------------

 

SELECT a, b
, LEVEL lv
, TRUNC(a/b) + CASE WHEN LEVEL <= a-TRUNC(a/b)*b THEN 1 ELSE 0 END v1
, TRUNC(100/b) + CASE WHEN LEVEL <= 100-TRUNC(100/b)*b THEN 1 ELSE 0 END v2
, TRUNC(100/b,2) + CASE WHEN LEVEL*0.01 <= 100-TRUNC(100/b,2)*b THEN 0.01 ELSE 0 END v3
FROM (SELECT 90922255 a, 3 b FROM dual)
CONNECT BY LEVEL <= b

댓글 없음:

댓글 쓰기