首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sql 难题 求解!该怎么处理

2013-01-26 
sql 难题 求解!现在有表A:代号父代号名称数量0010电焊5001001001车工2001002001机车30020汽车5002001002坦

sql 难题 求解!
现在有表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.表里的数据是变化的。就是希望当有数据进行操作时,各个父及会自动汇总,希望高手写的详细点。本人新手,谢了!!!
只要运行通过。马上结贴!!!
[解决办法]

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 行受影响)

*/


[解决办法]
create table tb (代号 varchar(100),父代号 varchar(100),名称 varchar(10),数量 int)
insert 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
go
create trigger abc on tb
after insert 
as 
declare @temp varchar(50),@qty int
select @temp=代号,@qty=数量 from inserted


while len(@temp)>3
begin
set @temp=substring(@temp,1,len(@temp)-3)
update tb set 数量=数量+@qty where 代号=@temp
end
go
insert tb select '001003','','',2
go
select * from tb

/*
0010电焊7
001001001车工2
001002001机车3
0020汽车5
002001002坦克5
0030飞机6 
001003        2
*/

热点排行