今天做作业一道题目彻底搞晕了。越弄越乱麻烦各位大哥大姐们给指点下。别整太难的。
题目如下:新建一个存储过程CAL_REVENUES。该过程计算出EMP表雇员每年的薪水总额,年终奖,总收入,并将计算出来的数据插入到REVENUES表中。
要求:
1. 删除REVENUES表2009年的数据。
2. EMP表所有数据都作为处理对象。
3. 将年份(2009),员工编号,员工姓名,部门名,计算出的薪水总额,年终奖,总收入插入到REVENUES表中。
4. 数据全部插入成功后提交。
5. 如果出现异常,请将异常信息打印到控制台上。
6. 薪水总额,年终奖,总收入计算公式如下:总收入(REVENUES)=SALALL+BONUS;
薪水总额(SALALL)=(SAL+COMM-CAL_TAX(SAL+COMM))*12;
年终奖(BONUS)计算方法如下:i:基础值(按JOB分):
  CLERK:SAL * 2.5
  SALLESMAN:SAL * 2 + COMM * 4
  ANALYST: SAL * 4
  MANAGER: 按部门分:
        ACCOUNTING : SAL * 5;
        RESEATCH:    SAL * 4;
        SALES:       SAL * 3;
        OPERATIONS:  SAL * 2;
        其他:       SAL * 1.5;
ii:根据工龄:
如果入社时间大于等于5年,在上述基础上加2000;
如果入社时间大于等于3年,小于5年,在上述基础上加1000;如果入社时间小于3年,在上述基础上加500;iii:根据请假情况(ATTENDANCE表):
 如果某位员工请假天数总计大于5天,那么扣500;
 如果全勤的,加500。
REVENUES表结构。表名:收入信息表(REVENUES)
 字段名    数据类型    长度   可空性     要求        说明
 YEARLY      CHAR       4    NOT NULL   设为主键   年份
 EMPNO       NUMBER     4    NOT NULL   设为主键   员工番号
 ENAME      VARCHAR2    30                         员工名
 DNAME      VARCHAR2    20                         部门名
 SALALL     NUMBER     10,2   NOT NULL   默认值0   薪水总额
 BONUS      NUMBER     10,2   NOT NULL   默认值0   年终奖
 REVENUES   NUMBER     10,2   NOT NULL   默认值0   总收入
谢谢各位大哥大姐了。

解决方案 »

  1.   

    该用到LOOP 或者游标吗,。。
      

  2.   

    if exists (select * from sysobjects where name='Sum_wage')
    drop procedure Sum_wage
    GO
    create procedure Sum_wage 
    @PWage int,
    @AWage int,
    @total int
    as 
    while (1=1)
    begin
    if (select count(*) from ProWage)>2*(select count(*) from ProWage where Wage>=@PWage)
    update ProWage set @total=@total+@AWage,Wage=Wage+@AWage
    else
    break
    end
    print'一共加薪:'+convert(varchar,@total)+'元'
    print'加薪后的程序员工资列表:'
    select * from ProWage
    --调用存储过程1--
    exec Sum_wage @PWage=2000,@AWage=100,@total=0
    exec Sum_wage @PWage=2200,@AWage=100,@total=0
    exec Sum_wage @PWage=3000,@AWage=100,@total=0
    exec Sum_wage @PWage=4000,@AWage=100,@total=0
    exec Sum_wage @PWage=5000,@AWage=100,@total=0
    exec Sum_wage @PWage=6000,@AWage=100,@total=0
      

  3.   

    拿去参考就行,看懂后自己照着这个再写一个
    这个跟你的要求相差不远if exists (select * from sysobjects where name='Sum_wage')
    drop procedure Sum_wage
    GO
    create procedure Sum_wage 
    @PWage int,
    @AWage int,
    @total int
    as 
    while (1=1)
    begin
    if (select count(*) from ProWage)>2*(select count(*) from ProWage where Wage>=@PWage)
    update ProWage set @total=@total+@AWage,Wage=Wage+@AWage
    else
    break
    end
    print'一共加薪:'+convert(varchar,@total)+'元'
    print'加薪后的程序员工资列表:'
    select * from ProWage
    --调用存储过程1--
    exec Sum_wage @PWage=2000,@AWage=100,@total=0
    exec Sum_wage @PWage=2200,@AWage=100,@total=0
    exec Sum_wage @PWage=3000,@AWage=100,@total=0
    exec Sum_wage @PWage=4000,@AWage=100,@total=0
    exec Sum_wage @PWage=5000,@AWage=100,@total=0
    exec Sum_wage @PWage=6000,@AWage=100,@total=0--2、创建存储过程2--
    if exists (select * from sysobjects where name='Avg_wage')
    drop procedure Avg_wage
    GO
    create procedure Avg_wage 
    @PWage int,
    @AWage int,
    @total int
    as 
    while (1=1)
    begin
    if ((select Avg(Wage) from ProWage)<=@PWage)
    update ProWage set @total=@total+@AWage,Wage=Wage+@AWage
    else
    break
    end
    print'一共加薪:'+convert(varchar,@total)+'元'
    print'加薪后的程序员工资列表:'
    select * from ProWage
    --调用存储过程--
    exec Avg_wage @PWage=3000,@AWage=200,@total=0
    exec Avg_wage @PWage=4500,@AWage=200,@total=0