--创建表 if   exists(select   *   from   sysobjects   where   name='zf') 
  drop   table   zf create   table   zf 

学号   numeric(8,0)   primary   key, 
姓名   varchar(20)   not   null, 
总分   float   null, 
等级   char(4)   null 
) if   exists(select   *   from   sysobjects   where   name='shuxue') 
  drop   table   shuxue create   table   shuxue 

学号   numeric(8,0), 
分数   float   null 
) if   exists(select   *   from   sysobjects   where   name='english') 
  drop   table   english create   table   english 

学号   numeric(8,0), 
分数   float   null 
) if   exists(select   *   from   sysobjects   where   name='computer') 
  drop   table   computer create   table   computer 

学号   numeric(8,0), 
分数   float   null 
) if   exists(select   *   from   sysobjects   where   name='yuwen') 
  drop   table   yuwen create   table   yuwen 

学号   numeric(8,0), 
分数   float   null 
) select   *   from   zf 
--------触发器-------------- 
if   exists(select   *   from   sysobjects   where   name='trig_shuxue') 
drop   trigger   trig_shuxue create   trigger   trig_shuxue   on   shuxue   for   insert   as 
      declare   @学号   int,@分数   int 
      select   @学号=学号,@分数=分数   from   shuxue 
    if   @分数> =0   and   @分数 <=100 
      begin 
      update   zf   set   总分=总分+@分数   where   @学号=学号 
      end 
go if   exists(select   *   from   sysobjects   where   name='trig_english') 
drop   trigger   trig_english create   trigger   trig_english   on   english   for   insert   as 
      declare   @学号   int,@分数   int 
      select   @学号=学号,@分数=分数   from   english 
    if   @分数> =0   and   @分数 <=100 
      begin 
      update   zf   set   总分=总分+@分数   where   @学号=学号 
      end 
go if   exists(select   *   from   sysobjects   where   name='trig_computer') 
drop   trigger   trig_computer create   trigger   trig_computer   on   computer   for   insert   as 
      declare   @学号   int,@分数   int 
      select   @学号=学号,@分数=分数   from   computer 
    if   @分数> =0   and   @分数 <=100 
      begin 
      update   zf   set   总分=总分+@分数   where   @学号=学号 
      end 
go if   exists(select   *   from   sysobjects   where   name='trig_yuwen') 
drop   trigger   trig_yuwen create   trigger   trig_yuwen   on   yuwen   for   insert   as 
      declare   @学号   int,@分数   int 
      select   @学号=学号,@分数=分数   from   yuwen 
    if   @分数> =0   and   @分数 <=100 
      begin 
      update   zf   set   总分=总分+@分数   where   @学号=学号 
      end 
go -----------------输入值---------------- insert   into   zf   values(20050001,'tom',0,'?') 
insert   into   zf   values(20050002,'jane',0,'?') 
insert   into   zf   values(20050003,'bush',0,'?') 
insert   into   zf   values(20050004,'hani',0,'?') 
insert   into   zf   values(20050005,'toms',0,'?') 
insert   into   zf   values(20050006,'janes',0,'?') 
--select   *   from   zf 
--drop   table   zf 
insert   into   shuxue   values(20050001,60) 
insert   into   shuxue   values(20050002,45) 
insert   into   shuxue   values(20050003,80) 
insert   into   shuxue   values(20050004,76) 
insert   into   shuxue   values(20050005,94) 
insert   into   shuxue   values(20050006,84) 
--select   *   from   shuxue 
--select   *   from   zf 
-- 
insert   into   english   values(20050001,54)   
insert   into   english   values(20050002,45)   
insert   into   english   values(20050003,82)   
insert   into   english   values(20050004,76)   
insert   into   english   values(20050005,81)   
insert   into   english   values(20050006,88)   
--select   *   from   english 
--select   *   from   zf 
-- 
insert   into   computer   values(20050001,42)   
insert   into   computer   values(20050002,64)   
insert   into   computer   values(20050003,80)   
insert   into   computer   values(20050004,76)   
insert   into   computer   values(20050005,86)   
insert   into   computer   values(20050006,84) 
--select   *   from   computer 
--select   *   from   zf 
-- 
insert   into   yuwen   values(20050001,86)   
insert   into   yuwen   values(20050002,84)   
insert   into   yuwen   values(20050003,87)   
insert   into   yuwen   values(20050004,78)   
insert   into   yuwen   values(20050005,42)   
insert   into   yuwen   values(20050006,41) 
--select   *   from   yuwen 
select   *   from   zf 
-- 各位大哥~~小弟今年18,刚学SQL不久,今天忙了一下午~打算玩个小“项目”,但是到现在,预期目的还没有达到~ 
简单点就是想在建立一个触发器,依实时变化的总分更新ZF表中的等级~ 
更复杂点目的就是想在每次输入成绩的时候,依据总分,和输入的课程次数判定等级,比如输入三门课程成绩后,总分> 250为优秀,总分> 210为良好,总分> 150为及格,0 <总分 <150为不及格,   跪求各位大哥大嫂~大叔大妈~偶郁闷了N久,没人问~只能在BBS里发贴啦~~盼您的“馅饼”

解决方案 »

  1.   


    --建议看看我的Blog,触发器常见问题你这都有,简单点评一个create       trigger       trig_shuxue       on       shuxue       
    for       insert       as                                 --只处理insert 或许不是大问题
                declare       @学号       int,@分数       int    -- 很奇怪,问什么数据类型是int
                select       @学号=学号,@分数=分数       from       shuxue  --这句莫名其妙,下面的不评了,
            if       @分数>   =0       and       @分数   <=100   
                begin   
                update       zf       set       总分=总分+@分数       where       @学号=学号   
                end   
    go   --写个大概的给你吧,只计算总分的,因为你下面评级的要求很难做,原因是你的表结构不合理,应该加个课程数
    --或者平均分在zf表,注释的代码你可以参考下create       trigger       trig_shuxue       on       shuxue       
    for       insert       as                                 --只处理insert 或许不是大问题
    update zf set 总分=zf.总分+i.分数
    from inserted i,zf
    where i.学号=zf.学号
    go   /*    假设有已经输入课程数字段 
    create       trigger       trig_shuxue       on       shuxue       
    for       insert       as                                 --只处理insert 或许不是大问题
    update zf set 总分=zf.总分+i.分数,已经输入课程数=zf.已经输入课程数+1,
       等级=case when zf.已经输入课程数+1<>3 then zf.等级
              else case when zf.总分+i.分数> 250 then '优秀' when zf.总分+i.分数>210 then '良好' when zf.总分+i.分数>150 then '及格' else '不及格' end end
    from inserted i,zf
    where i.学号=zf.学号
    go   
      

  2.   

    [code=SQL]
    create trigger trig_shuxue on shuxue for insert
    as   
    update  zf set 总分=分数,等级=case when 分数 >250 then '优秀' 
    when 分数> 210 and  分数<250  then '良好' 
    when 分数<210  and  分数> 150 then '及格' 
    when    分数 <150 then '不及' end
    from zf inner join 
    (
    select 学号,Sum(isnull(分数,0)) 分数 
    from
    (select * from shuxue   
    union all
    select * from english   
    union all    
    select * from computer       
    union all
    select * from yuwen     ) as T  
    group by 学号) as t2 
    on zf.学号=t2学号
    [code]
      

  3.   


    create trigger trig_shuxue on shuxue for insert
    as   
    update  zf set 总分=分数,等级=case when 分数 >250 then '优秀' 
    when 分数> 210 and  分数<250  then '良好' 
    when 分数<210  and  分数> 150 then '及格' 
    when    分数 <150 then '不及' end
    from zf inner join 
    (
    select 学号,Sum(isnull(分数,0)) 分数 
    from
    (select * from shuxue   
    union all
    select * from english   
    union all    
    select * from computer       
    union all
    select * from yuwen     ) as T  
    group by 学号) as t2 
    on zf.学号=t2学号

    四个表的触发器一样就行

      

  4.   

    set nocount on
    go
    --创建表 
    if exists(select * from sysobjects where name='dd_学科') 
    drop table dd_学科 create table dd_学科
    (
    学科ID tinyint not null primary key,
    学科Name nvarchar(32)
    )
    /* 1:数学, 2:英语, 3:计算机, 4: 语文*/
    insert into dd_学科 values (1,'数学')
    insert into dd_学科 values (2,'英语')
    insert into dd_学科 values (3,'计算机')
    insert into dd_学科 values (4,'语文')
    goif exists(select * from sysobjects where name='学分') 
    drop table 学分 create table 学分 

    学号 numeric(8,0), 
    学科 tinyint, 
    分数 float null 
    ) if exists(select * from sysobjects where name='学生成绩') 
    drop table 学生成绩 create table 学生成绩 

    学号 numeric(8,0) primary key, 
    姓名 varchar(20) not null, 
    总分 float null, 
    等级 char(4) null 

    go
    -- 直接计算
    update 学生成绩 set
     总分 = b.总分
    ,等级 = case when 学科数>=3 then
    case 
    when b.总分 >= 250 then '优秀'
    when b.总分 >= 210 then '良好'
    when b.总分 >= 150 then '及格'
    else '不及格' end
    end 
    from 学生成绩 a
    join (
    select 学号, 总分 = sum(分数), 学科数 = count(学科)
    from 学分
    group by 学号 
    ) b on a.学号=b.学号
    go
    -- 
    if exists(select * from sysobjects where name='trig_学分') 
    drop trigger trig_学分 
    go
    create trigger trig_学分 on 学分 for insert
    as begin
    update 学生成绩 set
     总分 = 总分 + 分数
    ,等级 = case when (select count(1) from 学分 b where 学号=i.学号) >=3 then
    case 
    when (总分 + 分数) >= 250 then '优秀'
    when (总分 + 分数) >= 210 then '良好'
    when (总分 + 分数) >= 150 then '及格'
    else '不及格' end
    end
    from 学生成绩 a, inserted i 
    where a.学号=i.学号
    end
    go-----------------输入值---------------- 
    insert into 学生成绩 values(20050001,'tom',0,NULL) 
    insert into 学生成绩 values(20050002,'jane',0,NULL) 
    insert into 学生成绩 values(20050003,'bush',0,NULL) 
    insert into 学生成绩 values(20050004,'hani',0,NULL) 
    insert into 学生成绩 values(20050005,'toms',0,NULL) 
    insert into 学生成绩 values(20050006,'janes',0,NULL) 
    --select * from zf 
    --drop table zf 
    insert into 学分 values(20050001,1,60) 
    insert into 学分 values(20050002,1,45) 
    insert into 学分 values(20050003,1,80) 
    insert into 学分 values(20050004,1,76) 
    insert into 学分 values(20050005,1,94) 
    insert into 学分 values(20050006,1,84) 
    --select * from shuxue 
    --select * from zf 
    -- 
    insert into 学分 values(20050001,2,54) 
    insert into 学分 values(20050002,2,45) 
    insert into 学分 values(20050003,2,82) 
    insert into 学分 values(20050004,2,76) 
    insert into 学分 values(20050005,2,81) 
    insert into 学分 values(20050006,2,88) 
    --select * from english 
    --select * from zf 
    -- 
    insert into 学分 values(20050001,3,42) 
    insert into 学分 values(20050002,3,64) 
    insert into 学分 values(20050003,3,80) 
    insert into 学分 values(20050004,3,76) 
    insert into 学分 values(20050005,3,86) 
    insert into 学分 values(20050006,3,84) 
    --select * from computer 
    --select * from zf 
    -- 
    insert into 学分 values(20050001,4,86) 
    insert into 学分 values(20050002,4,84) 
    insert into 学分 values(20050003,4,87) 
    insert into 学分 values(20050004,4,78) 
    insert into 学分 values(20050005,4,42) 
    insert into 学分 values(20050006,4,41) 
    --select * from yuwen 
    select * from 学生成绩 drop table 学生成绩,学分,dd_学科
      

  5.   

    学号 姓名 总分 等级
    20050001 tom 242.0 良好
    20050002 jane 238.0 良好
    20050003 bush 329.0 优秀
    20050004 hani 306.0 优秀
    20050005 toms 303.0 优秀
    20050006 janes 297.0 优秀
      

  6.   

    用CASE WHEN  THEN也许要简单一些
    用不到触发器吧