2017-02-26 20 views
2

loop 내부에 sum의 값이 필요합니다.(Oracle) 루프 내부에서 합계 값을 얻는 방법?

DECLARE 
VAR_PCT NUMBER; 
CURSOR C1 IS 
SELECT A, B FROM TBL; 
BEGIN 
FOR REC1 IN C1 
    LOOP 
--This where i need the value of sum(rec1.b) to calculate VAR_PCT:=(REC1.B/SUM(REC1.B))*100 
    DBMS_OUTPUT.PUT_LINE(REC1.A ||'|'|| REC1.B ||'|'||VAR_PCT) 
END LOOP; 
END; 

그래서, 나는 기본적으로 B의 합계를 얻는 방법을 알아 내야

편집 : 내가 합 전에 축적 또 하나 개의 변수가 있음을 잊어

*FOR REC1 IN C1 
     LOOP* 
    VAR_X := VAR_X+REC1.B 
    *--This where i need the value of sum(rec1.b) to calculate VAR_PCT:=(REC1.B/SUM(REC1.B))*100 
     DBMS_OUTPUT.PUT_LINE(REC1.A ||'|'|| REC1.B ||'|'||VAR_PCT) 
    END LOOP;* 

그리고 VAR_PCT는 (VAR_X/SUM (REC1.B)) *에 대한 값이 100

,617,

그래서 루프 안에서 계산해야합니다.

+0

은'SQL' 자체가, 두 번 루프를 실행, 그렇지 않은 경우, 먼저를 계산하기 위해 SUM을 호출하고 결과 집합을 컬렉션에 저장합니다. 나중에 컬렉션을 가로 지르는 결과를 인쇄하십시오. –

답변

2

창 기능 sum(col) over()을 사용하여 커서 정의 자체에서 전체 합계를 찾을 수 있습니다. 이것은 일반적으로 루프에서 순차적으로 일을 수행하는 것이 더 효과적입니다. 합이 각각 A의 경우

DECLARE 
    CURSOR C1 IS 
     SELECT A, B, 100 * b/sum(b) over() VAR_PCT FROM TBL; 
BEGIN 
    FOR REC1 IN C1 
    LOOP 
     DBMS_OUTPUT.PUT_LINE(REC1.A ||'|'|| REC1.B ||'|'||REC1.VAR_PCT) 
    END LOOP; 
END; 

, 다음 partition by 사용 : 페치 될 예정이다

DECLARE 
    CURSOR C1 IS 
     SELECT A, B, 100 * b/sum(b) over (partition by A) VAR_PCT FROM TBL; 
BEGIN 
    FOR REC1 IN C1 
    LOOP 
     DBMS_OUTPUT.PUT_LINE(REC1.A ||'|'|| REC1.B ||'|'||REC1.VAR_PCT) 
    END LOOP; 
END; 
+0

고마워요.하지만 뭔가 잊어 버렸습니다. 제 수정 된 질문을 친절하게 검토하십시오. –

+0

@sunudioh - 이미 SQL 자체에서 계산했습니다. '100 * b/sum (b) over() VAR_PCT'를보십시오 – GurV

+0

오 예, 지금 이해합니다. 합계는 루프 내에서 REC1.VAR_PCT로 사용될 수 있습니다. 고마워요. 너는 나의 하루를 다시 구했다. –

관련 문제