日期:2014-05-18  浏览次数:20361 次

一个简单的表内求平均数和的问题
表1
ID     数量1   数量2   得分
1         2             3
2         4             6
3         5             8


得分等于数量1所占比例数加上数量2所占比例数
如ID1   得分=2/(2+4+5)+3/(3+6+8)

用存取过程或触发器如何做到,我的是MYSQL数据库,谢谢!

------解决方案--------------------
create table tb(ID int, 数量1 int,数量2 int)
insert into tb values(1, 2, 3)
insert into tb values(2, 4, 6)
insert into tb values(3, 5, 8)
select ID,数量1,数量2,得分=
cast(cast(数量1 as decimal(18,2))/(select sum(数量1) from tb) + cast(数量2 as decimal(18,2))/(select sum(数量2) from tb) as decimal(18,2))
from tb

drop table tb

/*
ID 数量1 数量2 得分
----------- ----------- ----------- --------------------
1 2 3 .36
2 4 6 .72
3 5 8 .93

(所影响的行数为 3 行)
*/
------解决方案--------------------
create table #T(ID int,数量1 float,数量2 float)
insert into #T
select 1,2,3 union all
select 2,4,6 union all
select 3,5,8

select sum(数量1) as s1,sum(数量2) as s2
into #tmp
from #T

select a.*,[得分]=(a.数量1/b.s1+a.数量2/b.s2)
from #T a, #tmp b
---------------------------------
1 2.0 3.0 0.35828877005347592
2 4.0 6.0 0.71657754010695185
3 5.0 8.0 0.92513368983957212

------解决方案--------------------
CREATE TRIGGER tr_test
ON dbo.[表1]
FOR INSERT, UPDATE
AS
If UPDATE (数量1) OR UPDATE(数量2)
BEGIN
update dbo.[表1]
set 得分=cast(数量1/(select sum(数量1) from 表1) as decimal(18,2)) + cast(数量2/(select sum(数量2) from 表1) as decimal(18,2))
ROLLBACK TRANSACTION
END
GO
------解决方案--------------------
CREATE TRIGGER tr_test
ON dbo.[表1]
FOR INSERT,DELETE,UPDATE
AS
BEGIN
update dbo.[表1]
set 得分=cast(数量1/(select sum(数量1) from 表1) as decimal(18,2)) + cast(数量2/(select sum(数量2) from 表1) as decimal(18,2))
ROLLBACK TRANSACTION
END
GO

------解决方案--------------------
select ID,数量1,数量2,得分=
cast(数量1/(select sum(数量1) from 表1) as decimal(18,2)) + cast(数量2/(select sum(数量2) from 表1) as decimal(18,2))
from 表1
----------------------------------------------------
一解可行的