2017-02-26 24 views
2

我需要循环内和的值。(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

这就是为什么我需要在循环内计算它。

+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。非常感谢先生。你再次拯救了我的一天。 –