现在有表A:代号 父代号 名称 数量
001 0 电焊 5
001001 001 车工 2
001002 001 机车 3
002 0 汽车 5
002001 002 坦克 5
003 0 飞机 6现在想用触发器实现:
1.每当对数据进行增删改的时候,数据自动进行逐级汇总。
比如:当插入一条数据 代号 是001003 的时候,电焊 会自动汇总他下面的数量,如:001003的数量是2 则 电焊的数量应该是7.
2.表里的数据是变化的。就是希望当有数据进行操作时,各个父及会自动汇总,希望高手写的详细点。本人新手,谢了!!!
只要运行通过。马上结贴!!!

解决方案 »

  1.   

    create table tb(代号 nvarchar(20),父代号 nvarchar(20),名称 nvarchar(20),数量 int)
    insert into tb select '001','0','电焊',5
    insert into tb select '001001','001','车工',2
    insert into tb select '001002','001','机车',3
    insert into tb select '002','0','汽车',5
    insert into tb select '002001','002','坦克',5
    insert into tb select '003','0','飞机',6
    go
    create trigger whereinsert
    on tb
    after insert
    as
    begin
    update tb set 数量=b.数量+a.数量 from tb b inner join inserted a on b.代号=a.父代号
    end
    go
    create trigger whereupdate
    on tb
    after update
    as
    begin
    update tb set 数量=b.数量+a.数量-c.数量 from tb b inner join inserted a on b.代号=a.父代号 inner join deleted c on b.代号=c.父代号
    end
    go
    create trigger wheredelete
    on tb
    after delete
    as
    begin
    update tb set 数量=b.数量-c.数量 from tb b inner join deleted c on b.代号=c.父代号
    end
    go
    insert into tb select '003001','003','喷气式客机',10
    select * from tb
    update tb set 数量=3 where 代号='003001'
    select * from tb
    delete from tb where 代号='003001'
    select * from tb
    go
    drop table tb
    /*
    代号                   父代号                  名称                   数量
    -------------------- -------------------- -------------------- -----------
    001                  0                    电焊                   5
    001001               001                  车工                   2
    001002               001                  机车                   3
    002                  0                    汽车                   5
    002001               002                  坦克                   5
    003                  0                    飞机                   16
    003001               003                  喷气式客机                10(7 行受影响)(1 行受影响)
    (1 行受影响)
    代号                   父代号                  名称                   数量
    -------------------- -------------------- -------------------- -----------
    001                  0                    电焊                   5
    001001               001                  车工                   2
    001002               001                  机车                   3
    002                  0                    汽车                   5
    002001               002                  坦克                   5
    003                  0                    飞机                   9
    003001               003                  喷气式客机                3(7 行受影响)(0 行受影响)(1 行受影响)
    (1 行受影响)
    代号                   父代号                  名称                   数量
    -------------------- -------------------- -------------------- -----------
    001                  0                    电焊                   5
    001001               001                  车工                   2
    001002               001                  机车                   3
    002                  0                    汽车                   5
    002001               002                  坦克                   5
    003                  0                    飞机                   6(6 行受影响)*/
      

  2.   

    --> 测试数据: tb
    if object_id('tb') is not null drop table tb
    go
    create table tb (代号 varchar(6),父代号 varchar(3),名称 varchar(4),数量 int)
    insert into tb
    select '001','0','电焊',5 union all
    select '001001','001','车工',2 union all
    select '001002','001','机车',3 union all
    select '002','0','汽车',5 union all
    select '002001','002','坦克',5 union all
    select '003','0','飞机',6--UPDATE INSERTED,DELETED
    --INSERT INSERTED
    --DELETE DELETEDif object_id('gg') is not null drop trigger gg
    go
    create trigger gg on tb
    for delete,update,insert -- 前触发AS--删除 
    IF NOT EXISTS(SELECT 1 FROM INSERTED)
    update tb
    set 数量=b.数量-D.数量
    from ( select 父代号,sum(数量)数量 from deleted group by 父代号) D ,tb b
    where D.父代号=b.代号  
    ELSE
    --UPDATE
    IF EXISTS(SELECT 1 FROM deleted)
    update tb
    set 数量=b.数量-D.数量+I.数量
    from ( select 父代号,sum(数量)数量 from deleted group by 父代号) D ,
    ( select 父代号,sum(数量)数量 from INSERTED group by 父代号) I ,tb b
    where d.父代号=b.代号  AND I.父代号=b.代号
    --INSERT
    ELSE
    update tb
    set 数量=b.数量+i.数量
    from ( select 父代号,sum(数量)数量 from INSERTED group by 父代号) i ,tb b
    where i.父代号=b.代号  
    GO --delete from tb where 代号='001002'
    --select * from tb
    /*
    代号     父代号  名称   数量
    ------ ---- ---- -----------
    001    0    电焊   2
    001001 001  车工   2
    002    0    汽车   5
    002001 002  坦克   5
    003    0    飞机   6(5 行受影响)
    */
    --insert tb select '001003','001','dd车',3  --select * from tb/*
    代号     父代号  名称   数量
    ------ ---- ---- -----------
    001    0    电焊   8
    001001 001  车工   2
    001002 001  机车   3
    002    0    汽车   5
    002001 002  坦克   5
    003    0    飞机   6
    001003 001  dd车  3(7 行受影响)
    */update tb set 数量=5 where 代号='001002'
    select * from tb代号     父代号  名称   数量
    ------ ---- ---- -----------
    001    0    电焊   7
    001001 001  车工   2
    001002 001  机车   5
    002    0    汽车   5
    002001 002  坦克   5
    003    0    飞机   6(6 行受影响)