如何在oracle存储过程中使用sum()函数?

如何在oracle存储过程中使用sum()函数?,oracle,plsql,Oracle,Plsql,下面的示例运行良好,并返回一些行。但我需要行的摘要 DECLARE x number; Cursor c1 is select sal,deptno from emp; rw c1%rowtype; BEGIN x:=0; open c1; LOOP fetch c1 into rw; FOR i IN 1..rw.deptno LOOP x:=x+rw.sal; end loop; exit

下面的示例运行良好,并返回一些行。但我需要行的摘要

DECLARE
    x number;
Cursor c1 is
    select sal,deptno from emp;
    rw c1%rowtype;
BEGIN
    x:=0;
    open c1;
    LOOP
     fetch c1 into rw;
     FOR i IN 1..rw.deptno LOOP
       x:=x+rw.sal;
     end loop;
     exit when c1%notfound;
     DBMS_OUTPUT.PUT_LINE(x);
    END LOOP;
    close c1;
END;
/
假设你有三名员工,每个员工的工资都不一样。工资到期期限为10个月、20个月和30个月。工资到期已久。因此,您希望在每月工资中增加2%的奖金金额,如下所示:

以下描述适用于10个月的单身员工:

第一个月工资=800=>800*2%=16.00=>Total=800+16=816

第二个月工资=816=>816*2%=16.32=>Total=816+16.32=832.32

第十个月工资=956.07=>956.07*%=19.12=>Total=956.07+19.12=975.20


第1个月的总工资=816。因此,第二个月的工资=816。这将持续10个月。每个员工都有相同的条件。所以我需要总计列的摘要。谢谢并致以最诚挚的问候。

当您在查询中使用聚合函数SUM时,与添加自己时不同,您不需要将其转换为NULL。SUM负责这件事。尽管,正如@davidardridge所指出的,如果您希望汇总记录组中的所有行都包含NULL,那么您的总和也将为NULL。如果您想返回一个值,您可以按照如下方式包装您的总和coaleseSummal,0

这将给你所有薪水的总和

select SUM(sal) TotalSal from emp;
这将按部门给你总数

select SUM(sal) TotalDeptSal, deptno 
from emp
group by deptno;
在您的问题中,您发布了您需要在存储过程中执行它,而您的代码是一个匿名块。若要从存储过程返回单个值,可以选择使用返回参数声明函数或使用输出参数声明存储过程。要从Oracle中的存储过程返回记录集,需要声明一个refcursor输出参数

CREATE OR REPLACE PROCEDURE Get_TotalSal_ByDept (
    p_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
    OPEN p_recordset FOR
        select SUM(sal) TotalDeptSal, deptno 
        from emp
        group by deptno;
END;
编辑

我看到您添加了行总数。这与原来的问题没有多大变化。不过,不需要使用游标。您可以运行2个查询并返回2个输出参数,一个包含按部门列出的数据,另一个是total

CREATE OR REPLACE PROCEDURE Get_SalByDept_WithTotal (
    p_total OUT NUMBER,
    p_recordset OUT SYS_REFCURSOR) AS
BEGIN 
    select SUM(sal) INTO p_total from emp;

    OPEN p_recordset FOR
        select SUM(sal) TotalDeptSal, deptno 
        from emp
        group by deptno;
END;

这就是你要找的吗?总数是多少

选择totals.deptNo、totals.deptottal、SUMtotals.deptottal OVER ORDER BY totals.id 从…起 选择deptNo、deptottal、rownum id 从…起 选择deptNo,sumsal*deptNo deptottal 来自emp 德普诺集团 总数 按totals.id排序;
如果你有某种部门Id,你可以使用它,而不是从ROWNUM中人工生成一个。我认为没有必要使用内部for循环来回答你的问题。如果你想要所有工资的总和,外部循环就足够了,可以为你做这项工作。因此,只需删除for循环并使用bms\u输出。将行放在一边主回路,什么是纽科尔?你只是改变了你的问题,它没有变得更清楚。我给你的答案仍然是真实的。添加多少列并不重要。只要添加到select中,就可以将它们添加到1..10/20/30循环中的i组中-这是必需的。循环一直运行到10、20、30。因为列Deptno有三个不同的值,例如10、20、30。所以你的结果和我的结果是不相等的。看我的第二个答案,0作为合并的结果会更好,0@DavidAldridge我试着用我们的新用户能理解的语言。换句话说,强调问题,而不是技术。事实上,在调用SUM时,根本不需要空转换函数。感谢您指出,如果中可能没有非空值的行,您只需要合并,真的。@davidardridge这是真的,真的