在delphi中,有一个表abc,表如下:
ID  NAME   chengji1  chengji2 chengji3 chengji4 chengji5 total   (chengji1到chengji5都是整型)
01  tom     80        90      60         80       68     NULL
02  jay     70        80      NULL       NULL     61     NULL
chengji1到chengji5是一个学生的成绩,可能是0分,在数据库中显示是NULL,total是总分,要对total自动求和,就是每输一个成绩,total都会变,如果修改了某一个成绩,total要求更新,如何实现?
谢谢大家。
我用 update abc set total=chengji1+chengji2+chengji3+chengji4+chengji5
ID为01的,total在表中可以看到总分,而ID为02的,因为有NULL,所以就没有结果,还是NULL。

解决方案 »

  1.   

    这个问题与数据库有关,如果你用oracle
    update abc set total=nvl(chengji1,0)+nvl(chengji2,0)+nvl(chengji3,0)+nvl(chengji4,0)+nvl(chengji5,0) 
    如果是sqlserver
    update abc set total=isnull(chengji1,0)+isnull(chengji2,0)+isnull(chengji3,0)+isnull(chengji4,0)+isnull(chengji5,0) 
      

  2.   

    在sql serve中可以增加一个update触发器,借用楼上的语句可以自动更新总分
      

  3.   

    数据库表中的 total 字段是多余的,造成冗余或不一致,不符合数据库设计理念。
    要得到 total 值,可使用视图,也可在应用程序中来计算。
    在 Delphi 中,在数据集控件(如ADOQuery) 上添加 Calculated 字段,用 OnCalcFields 事件来进行计算十分方便。
      

  4.   

    建议不要用null代替0分,null可以表示诸如缺考等。可以alter table下,修改default 0…,另外,total冗余。查询的时候直接使用chengji1+chengji2+chengji3+chengji4+chengji5 as total
      

  5.   

    引用 7 楼 ExSystem 的回复:
    建议不要用null代替0分,null可以表示诸如缺考等。可以alter table下,修改default 0…,另外,total冗余。查询的时候直接使用chengji1+chengji2+chengji3+chengji4+chengji5 as total 
     
    有道理up
    up
      

  6.   

    0分就要输入0,不要用null去替代;千万不要用触发器,它给你带来的麻烦比好处还要多。可以考虑用计算字段,但是如果你数据量比较大,而且需要频繁使用总分来进行统计,那么使用计算字段不一定合适:因为计算字段不会被索引。那么你可以创建一个冗余字段,然后在逻辑层进行控制。
      

  7.   

    update abc set chengji1=0 where chengji1 is null
    --...
    update abc set total=chengji1+chengji2+chengji3+chengji4+chengji5