通过表字段和计算公式得到结果的问题
declare @str_sql varchar(2000)
declare @temp table
(
A1 int,
A2 int,
A3 int,
formula varchar(30)
)
insert into @temp values(1,2,3, 'A1+A2+A3 ')
insert into @temp values(4,2,3, 'A1+A2+A3 ')
insert into @temp values(1,4,3, 'A1+A2+A3 ')
insert into @temp values(1,7,3, 'A1+A2+A3 ')
insert into @temp values(1,2,6, 'A1+A2+A3 ')
insert into @temp values(1,8,3, 'A1+A2+A3 ')
select * from @temp
表@temp中formula是A1、A2、A3的计算公式
怎样返回计算公式的值
最好不要通过游标
[解决办法]
需要游标才行.
[解决办法]
--看來只能跑cursor了
declare @str_sql varchar(2000)
declare @temp table
(
A1 int,
A2 int,
A3 int,
formula varchar(30)
)
insert into @temp values(1,2,3, 'A1+A2+A3 ')
insert into @temp values(4,2,3, 'A1+A2+A3 ')
insert into @temp values(1,4,3, 'A1+A2+A3 ')
insert into @temp values(1,7,3, 'A1+A2+A3 ')
insert into @temp values(1,2,6, 'A1+A2+A3 ')
insert into @temp values(1,8,3, 'A1+A2+A3 ')
declare @a1 int,@a2 int ,@a3 int,@formula varchar(30),@sql varchar(1000)
create table T(A1 int,A2 int,A3 int ,formula int)
declare c1 cursor for
select A1,A2,A3,formula from @temp
open c1
fetch next from c1 into @a1,@a2,@a3,@formula
while @@fetch_status=0
begin
select @formula=replace(replace(replace(@formula, 'A1 ',rtrim(@a1)), 'A2 ',rtrim(@a2)), 'A3 ',rtrim(@a3))
set @sql= 'insert into t select '+rtrim(@a1)+ ', '+rtrim(@a2)+ ', '+rtrim(@a3)+ ', '+@formula
exec (@sql)
fetch next from c1 into @a1,@a2,@a3,@formula
end
close c1
deallocate c1
select * from t
drop table t
/*
A1 A2 A3 formula
----------- ----------- ----------- -----------
1 2 3 6
4 2 3 9
1 4 3 8
1 7 3 11
1 2 6 9
1 8 3 12
*/
[解决办法]
SQl2000,函數不能用exec的...
[解决办法]
可以用类似OPENROWSET之类的~
把取formula定义成函数
不过,这个表结构没有KEY,没法关联
[解决办法]
如果 formula= 'A1+A2+A3 '是不是固定?
[解决办法]
--定义一个计算列的表结构.
declare @str_sql varchar(2000)
declare @temp table
(
A1 int,
A2 int,
A3 int,
formula as a1+a2+a3
)
insert into @temp values(1,2,3)
insert into @temp values(4,2,3)
insert into @temp values(1,4,3)
insert into @temp values(1,7,3)
insert into @temp values(1,2,6)
insert into @temp values(1,8,3)
select * from @temp
------解决方案--------------------
如果公式固定的话,就用公式字段处理,这样最简单。
[解决办法]
--看看以下能否符合楼主的要求
declare @temp table
(
A1 int,
A2 int,
A3 int,
formula varchar(30)
)
insert into @temp values(1,2,3, 'A1+A2+A3 ')
insert into @temp values(4,2,3, 'A1+A2-A3 ')
insert into @temp values(1,4,3, 'A1-A2+A3 ')
insert into @temp values(1,7,3, 'A1+A2+A3 ')
insert into @temp values(1,2,6, 'A1-A2-A3 ')
insert into @temp values(1,8,3, 'A1+A2+A3 ')
create table #
(
A1 int,
A2 int,
A3 int,
formula varchar(30),
value int
)
insert #(a1,a2,a3,formula)
select * from @temp
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ' when ' ' '+formula+ ' ' ' then '+formula+ ' '
from @temp
group by formula
exec( 'update # set value=case formula '+@sql+ ' end ')
select a1,a2,a3,value,formula ---+formula只是为了检查结果
from #
drop table #
--结果
a1 a2 a3 value formula
----------- ----------- ----------- ----------- ------------------------------
1 2 3 6 A1+A2+A3
4 2 3 3 A1+A2-A3
1 4 3 0 A1-A2+A3
1 7 3 11 A1+A2+A3
1 2 6 -7 A1-A2-A3
1 8 3 12 A1+A2+A3
(所影响的行数为 6 行)
[解决办法]
--動態SQL
declare @str_sql varchar(8000)
set @str_sql= ' '
declare @temp table
(
A1 int,
A2 int,
A3 int,
formula varchar(30)
)
insert into @temp values(1,2,3, 'A1+A2+A3 ')
insert into @temp values(4,2,3, 'A1+A2+A3 ')
insert into @temp values(1,4,3, 'A1+A2+A3 ')
insert into @temp values(1,7,3, 'A1+A2+A3 ')
insert into @temp values(1,2,6, 'A1+A2+A3 ')
insert into @temp values(1,8,3, 'A1+A2+A3 ')
select @str_sql=@str_sql+ 'select A1= '+rtrim(A1)+ ', A2= '+rtrim(A2)+ ', A3= '+rtrim(A3)+ ', formula= ' ' '+formula+
' ' ', Value= '+formula+ ' from(select A1= '+rtrim(A1)+ ', A2= '+rtrim(A2)+ ', A3= '+rtrim(A3)+ ')tmp union all '
from @temp
select @str_sql=left(@str_sql, len(@str_sql)-9)
exec(@str_sql)
--result
A1 A2 A3 formula Value
----------- ----------- ----------- -------- -----------
1 2 3 A1+A2+A3 6
4 2 3 A1+A2+A3 9
1 4 3 A1+A2+A3 8
1 7 3 A1+A2+A3 11
1 2 6 A1+A2+A3 9
1 8 3 A1+A2+A3 12
[解决办法]
三种方法
1.在程序中用算法实现(与遍历算法相似)
2.用动态SQL实现!
3.用前端程序连接到Excel后,借助Excel功能进行操作!(公式表放在Excel中)
--------------------------
刚做的一个项目就是自定义调整公式的!比较复杂。
速度方面还可以!
如果出现多级调度还要考虑公式优先级!