2017-02-26 16 views
2

私はループ内部で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の合計を取得する方法を見つけ出す必要があり

EDIT:私はサムまでに累積1以上の変数を持っていることを忘れてしまった

*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

そのため、ループ内で計算する必要があります。

+0

計算することが第一、そうでない場合には、二回ループを実行し、 'SQL'自体にフェッチされることになっています'SUM'を呼び出し、結果セットをコレクションに格納します。後で、コレクションを横断する結果を印刷します。 –

答えて

2

ウィンドウ機能sum(col) over()を使用して、カーソル定義自体の全体の合計を見つけることができます。これは通常、ループ内で手続き的に行うよりパフォーマンスが優れています。

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; 

合計は、各Aのためであれば、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として使用できます。ありがとうございました。あなたは私の日をもう一度救った。 –

関連する問題