下面的示例工作正常,它返回一些行.但我需要行的摘要.
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
………………………………………….. ……………………..
第10个月工资= 956.07 => 956.07 *%= 19.12 =>总计= 956.07 19.12 = 975.20
月份-1总薪水= 816.所以第二个月的工资= 816.这将持续10个月.每个员工都有相同的条件.所以我需要总列的摘要.谢谢和最好的问候.
解决方法
在查询中使用聚合函数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;