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

通过表字段和计算公式得到结果的有关问题

2012-01-19 
通过表字段和计算公式得到结果的问题declare@str_sqlvarchar(2000)declare@temptable(A1int,A2int,A3int,f

通过表字段和计算公式得到结果的问题
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中)
--------------------------
刚做的一个项目就是自定义调整公式的!比较复杂。
速度方面还可以!
如果出现多级调度还要考虑公式优先级!

热点排行