下面的示例工作正常,它会返回一些行。但我需要对行进行总结。
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个月。每个员工都有相同的条件。所以我需要总列的摘要。谢谢和最好的问候。
答案 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