【问题标题】:(Oracle) How to get sum value inside loop?(Oracle)如何在循环内获得总和值?
【发布时间】:2017-02-26 05:22:52
【问题描述】:

我需要循环内的 sum 值。

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 的值

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

【问题讨论】:

  • 它应该在SQL本身中被获取,否则,运行循环两次,首先计算SUM并将结果集存储到一个集合中。稍后,打印遍历集合的结果。

标签: oracle loops plsql sum


【解决方案1】:

您可以使用窗口函数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;

【讨论】:

  • 谢谢您,先生,但我忘记了一些事情。请查看我编辑的问题。
  • @sunudioh - 我已经在 SQL 本身中计算过了。见100 * b / sum(b) over () VAR_PCT
  • 哦,是的,我现在明白了。总和可用作循环内的 REC1.VAR_PCT。非常感谢先生。你又拯救了我的一天。
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2019-09-09
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
相关资源
最近更新 更多