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

时间:2015-06-13 18:47:17

标签: 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 when c1%notfound;
     DBMS_OUTPUT.PUT_LINE(x);
    END LOOP;
    close c1;
END;
/

假设您有三名员工,并且每位员工都有不同的薪水。工资有效期为10个月,20个月和30个月。薪水很长一段时间。因此,您希望每月为工资增加2%的奖金额:

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

月-1薪水= 800 => 800 * 2%= 16.00 =>总计= 800 + 16 = 816

月-2薪水= 816 => 816 * 2%= 16.32 =>总计= 816 + 16.32 = 832.32

............................................... .............................

Month-10 Salary = 956.07 => 956.07 *%= 19.12 =>总计= 956.07 + 19.12 = 975.20

月数-1总薪水= 816。所以第二个月的工资= 816。这将持续10个月。每个员工都有相同的条件。所以我需要总列的摘要。谢谢和最好的问候。

2 个答案:

答案 0 :(得分:2)

在查询中使用汇总功能SUM时(与自己添加时不同),您不需要转换NULL。 SUM处理它。虽然,正如@DavidAldridge指出的那样,如果您希望汇总记录组中的所有行都包含NULL,那么您的总和也将为NULL。如果要返回值,可以将总和包装如下coalesce(sum(sal),0)

这将为您提供所有工资的总和

select SUM(sal) TotalSal from emp;

这将按部门提供SUM

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个输出参数,一个是按部门分列的数据,另一个是总数。

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;

答案 1 :(得分:1)

这是你要找的吗?跑步总数?

SELECT totals.deptNo, totals.depttotal, SUM(totals.depttotal) OVER (ORDER BY totals.id)
FROM (
      select deptNo, deptTotal, rownum id
      from ( 
            select deptNo, sum(sal * deptNo) deptTotal
            from emp
            group by deptNo)
     ) totals
ORDER BY totals.id;

如果你有某种部门ID,你可以使用它来代替人工生成的ROWNUM