declare @条件id int,@temp1 int,@temp2 intselect @temp1=isnull(sum(sgs_percent),0) from tb_sgradestandard group by sgs_id where sgs_id=@条件idselect @temp2=sgs_percent from tb_gradestandard where sgs_id=@条件idif (@temp1>@temp2 or @temp>100)
  select '错误!'
else
  select 'OK!'

解决方案 »

  1.   

    更正:
      
    declare @条件id int,@temp1 int,@temp2 int
    -----小的评分标准
    select @temp1=isnull(sum(sgs_percent),0) from tb_sgradestandard group by sgs_id where sgs_id=@条件id
    -----大的评分标准
    select @temp2=sgs_percent from tb_gradestandard where sgs_id=@条件id
    -----比较
    if (@temp1>@temp2 or @temp1>100)
      select '错误!'
    else
      select 'OK!
      

  2.   

    唉呀!pengdali(大力)好! 我怎么看都看不懂你的耶!
     declare @条件id int,@temp1 int,@temp2 int
      @条件是什么?
      

  3.   

    不然你就用 pengdali(大力) 的方法,做一个函数或存储过程,条件不符合就不操作就是了
      

  4.   

    select isnull(sum(sgs_percent),0) from tb_sgradestandard group by sgs_id where sgs_id=@条件idselect isnull(sgs_percent,0) from tb_gradestandard where sgs_id=@条件idselect gs_id,
    case 
      when isnull(a.sgs_percent,0)>isnull(b.sgs_percent,0) or isnull(sum(sgs_percent),0)>100 then '错误'
      else 'OK'
    end 结果 into #结果表
    from (select sgs_id,sum(sgs_percent) sgs_percent tb_sgradestandard group by sgs_id) a,tb_gradestandard b where a.sgs_id=b.sgs_idselect * from #结果表
      

  5.   

    上面的不是:
    select gs_id,
    case 
      when isnull(a.sgs_percent,0)>isnull(b.sgs_percent,0) or isnull(sum(sgs_percent),0)>100 then '错误'
      else 'OK'
    end 结果 into #结果表
    from (select sgs_id,sum(sgs_percent) sgs_percent tb_sgradestandard group by sgs_id) a,tb_gradestandard b where a.sgs_id=b.sgs_idselect * from #结果表
      

  6.   

    我不知道,这结果放哪。
    用触发器也行!值里没有负数,一次会插入、删除、修改多条记录。from (select sgs_id,sum(sgs_percent) sgs_percent tb_sgradestandard (运行时出错说里有错)group by sgs_id) a,tb_gradestandard b where a.sgs_id=b.sgs_id不有这a,b是什么呀?
      

  7.   

    你的tb_sgradestandard有重复sgs_id吗??你的tb_gradestandard有重复sgs_id吗??你是不是想添加一条记录时检验一下呢???
      

  8.   

    我这个@条件id 应该就是tb_gradestandard里的gs_id的值。我不知道怎么用SQL语句表示tb_gradestandard里的gs_id!
      

  9.   

    谢谢大力!sgs_id 没有重复。tb_gradestandard里没有sgs_id值。有一个gs_id值,这个值是唯一的。在tb_sgradestandard里的gs_id是从tb_gradestandard里的gs_id值或得的。
    我是想添加一条记录时就检验一下!
      

  10.   

    你的 tb_sgradestandard 有没有重复的gs_id值呢???(关键)
      

  11.   

    我想你肯定有!
    是的话就:
    create  procedure 过程名 
    @sgs_id int,
    @sgs_standard char(20),
    @sgs_percent sgs_percent float,
    @gs_id int,
    @sgs_memo char(100)
    as
    begin
      declare @temp1 int,@temp2 int
    -----小的评分标准有相同sgs_id所以要group by
      select @temp1=isnull(sum(sgs_percent),0) from tb_sgradestandard group by sgs_id where sgs_id=@sgs_id
    -----大的评分标准
      select @temp2=sgs_percent from tb_gradestandard where sgs_id=@sgs_id 
    ----判断符合要求就插入
      if (@temp1>@temp2 or @temp1>100)
        insert tb_sgradestandard values (@sgs_id,@sgs_standard,@sgs_percent,@gs_id,@sgs_memo)
    end调用此存储过程
    过程名 参数1,参数2,参数3,参数4,参数5
    如:
    过程名 1,'xxs','ff',3,'sdsdf'
      

  12.   

    我想达到的效果就是控制tb_sgradestandard输入的sgs_percent值
    条件:  一:控制sgs_percent的总值不超过100
      二:控制当前输入的sgs_percent的总值不超过相应的在tb_gradestandard里    的等于gs_id的值的gs_percent值。也就是汇总所有tb_sgradestandard的gs_id值等于tb_gradestandard里的gs_id值时的sgs_percent的值!
      

  13.   

    没有负数,就不考虑删除了。
    create trigger tri_test on tb_sgradestandard
    on insert,update
    as
    begin
    declare @i int,@j int
    declare @a int,@b int  set @a=(select top 1 sum(b.sgs_percent) from  inserted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent)  set @b=(select top 1 sum(b.gs_percent) from  inserted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent)   if @a>@b or @a>100
         roalback
     
    end要控制,tb_gradestandard,也要做一个相应的触发器,不然它删除了,怎么办?
      

  14.   

    真的非常谢谢大力!
    select @temp1=isnull(sum(sgs_percent),0) from tb_sgradestandard group by sgs_id where sgs_id=@sgs_id //这where条件是什么意思?我不懂耶!这个@sgs_id 是用户输入的参数吧?怎么要用这个sgs_id 值与用户输入的值进行比较!
      

  15.   

    一个问题一个问题来!一:控制sgs_percent的总值不超过100:
    select @temp1=isnull(sum(sgs_percent),0) from tb_sgradestandard  where gs_id=@sgs_idif @temp>=100 就报错了!是不是这样???还是if 输入的sgs_percent>=100 就报错了!
      

  16.   

    TO: j9988(j9988) 这个tb_gradestandard怎么会被删除呢?:(我这个触发器不会做耶!
      

  17.   

    tb_gradestandard:
    create trigger tri_test2 on tb_gradestandard
    on update,delete
    as
    begin
    declare @i int
    declare @a int,@b int
    select @i=count(*) from inserted
    if @i<>0
    begin
      set @a=(select top 1 sum(b.sgs_percent) from  inserted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent)  set @b=(select top 1 sum(b.gs_percent) from  inserted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent)
    end
    if @i=0
    begin
      set @a=(select top 1 sum(b.sgs_percent) from  deleted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent)  set @b=(select top 1 sum(b.gs_percent) from  deleted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent)
    end
       if isnull(@a,0)>isnull(@b,0) or isnull(@a,0)>100
         roalback
     
    end
      

  18.   

    TO :大力
      运行你的在这里出错:where sgs_id=@sgs_id
      

  19.   

    对表tb_gradestandard修改,删除记录不是很正常吗?所以要两个触发器才控制得住。
      

  20.   

    老大你的@sgs_id有没有给值呀???
    declare @sgs_id
    set @sgs_id=1
    select @temp1=isnull(sum(sgs_percent),0) from tb_sgradestandard  where gs_id=@sgs_idif @temp>=100 
      select '错了'
    else
      select '对了'
      

  21.   

    这个@sgs_id 应该是从tb_gradestandard里获得的gs_id值呀!
      

  22.   

    你在上面这样写道:“这个表根据gs_id 与前面一个表的gs_id 相关联”"这个@sgs_id 应该是从tb_gradestandard里获得的gs_id值呀!"到底是怎样的???
      

  23.   

    是这样的呀!我前面也是这样说的呀!就是tb_sgradestandard->gs_id=tb_gradestandard->gs_id 值!呵呵,应该是j9988所写的那样子。但是运行出了一点点错误!在set附近有错误!
      

  24.   

    两表的关系:
    select * from tb_sgradestandard 别名1,tb_gradestandard 别名2 where tb_sgradestandard.gs_id=tb_gradestandard.gs_id
    是吗??
      

  25.   

    少一个)了
    set @a=(..........):create trigger tri_test on tb_sgradestandard
    on insert,update
    as
    begin
    declare @i int,@j int
    declare @a int,@b int  set @a=(select top 1 sum(b.sgs_percent) from  inserted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) )  set @b=(select top 1 sum(b.gs_percent) from  inserted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) )   if isnull(@a,0)>isnull(@b,0) or isnull(@a,0)>100
         roalback
     
    end
    tb_gradestandard:
    create trigger tri_test2 on tb_gradestandard
    on update,delete
    as
    begin
    declare @i int
    declare @a int,@b int
    select @i=count(*) from inserted
    if @i<>0
    begin
      set @a=(select top 1 sum(b.sgs_percent) from  inserted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) )  set @b=(select top 1 sum(b.gs_percent) from  inserted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) )
    end
    if @i=0
    begin
      set @a=(select top 1 sum(b.sgs_percent) from  deleted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) )  set @b=(select top 1 sum(b.gs_percent) from  deleted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) )
    end
       if isnull(@a,0)>isnull(@b,0) or isnull(@a,0)>100
         roalback
     
    end
      

  26.   

    想一想,少了一个ORDER BY DESC
    create trigger tri_test on tb_sgradestandard
    on insert,update
    as
    begin
    declare @i int,@j int
    declare @a int,@b int  set @a=(select top 1 sum(b.sgs_percent) from  inserted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) desc)  set @b=(select top 1 sum(b.gs_percent) from  inserted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) desc)   if isnull(@a,0)>isnull(@b,0) or isnull(@a,0)>100
         roalback
     
    end
    tb_gradestandard:
    create trigger tri_test2 on tb_gradestandard
    on update,delete
    as
    begin
    declare @i int
    declare @a int,@b int
    select @i=count(*) from inserted
    if @i<>0
    begin
      set @a=(select top 1 sum(b.sgs_percent) from  inserted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) desc)  set @b=(select top 1 sum(b.gs_percent) from  inserted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) desc)
    end
    if @i=0
    begin
      set @a=(select top 1 sum(b.sgs_percent) from  deleted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) desc)  set @b=(select top 1 sum(b.gs_percent) from  deleted a,tb_gradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) desc)
    end
       if isnull(@a,0)>isnull(@b,0) or isnull(@a,0)>100
         roalback
     
    end
      

  27.   

    为什么我照j9988的运行,他说gs_id不明确呢?
      

  28.   

    有一点不明白,
    set @a=(select top 1 sum(b.sgs_percent) from  inserted a,tb_sgradestandard b where a.gs_id=b.gs_id group by gs_id order by sum(b.sgs_percent) desc)//这里from  inserted a,tb_sgradestandard b 
    是什么意思呀?
      

  29.   

    不好意思:
    所有的:group by a.gs_id 改成:group by a.gs_id  
    inserted,deleted 是触发器内的表,具体看书或帮助
      

  30.   

    group by a.gs_id 改成:group by a.gs_id  呵呵,这是一样的吧,是改成oder by a.gs_id吗?inserted,deleted我看了一下!
      

  31.   

    order by sum(b.sgs_percent) desc
      

  32.   

    前面 group by gs_id 改成 gropu by a.gs_id 是对的。
      

  33.   

    TO: j9988   你帮我写的那a,b是指什么呀?
      

  34.   

    如:
    from  inserted a,tb_sgradestandard b 
    别名:
    inserted --a
    tb_sgradestandard --b
      

  35.   

    to j9988(j9988) 大虾
      昨天的问题搞定了吗????