例如,有一算法表:
公式 参数x 参数y 开始时间 结束时间
sum(x)/sum(y) a b 2004 2005
那么应该返回
select sum(a)/sum(b) from table where calendar between 2004 and 2005
的执行结果。
函数或者存储过程都可以,最好是函数,那么在其他SQL语句中也可以调用了
...全文
1335打赏收藏
如何实现公式用户自己定义?
例如,有一算法表: 公式 参数x 参数y 开始时间 结束时间 sum(x)/sum(y) a b 2004 2005 那么应该返回 select sum(a)/sum(b) from table where calendar between 2004 and 2005 的执行结果。 函数或者存储过程都可以,最好是函数,那么在其他SQL语句中也可以调用了
declare @s varchar(8000)
select @s='select '
+replace(replace(公式,'x',参数x),'y',参数y)
+' 结果,* from table where calendar between '
+cast(开始时间 as char(4))+' and '+cast(结束时间 as char(4))
from 算法表
用存储过程
create proc try_qs
@vtbname varchar(50), ---表名
@vColumnname1 varchar(50),---字段名1
@vColummname2 varchar(50),----字段名2
@Vtime1 varchar(50),----开始时间
@vTime varchar(50),---结束时间
@vcolname varchar(50) ---判断条件
as
exec('select sum('+quotename(@vColumnname1)+')/sum('+quotename(@vColumnname2)+') from '+quotename(@vtbname)+' where '+quotename(@vcolname)+' between '''+@vTime1+''' and '''+@vTime2+'''')---类似这样,没经过调试,楼主可以用个print来检查一下有无错
---测试
--print 'select sum('+quotename(@vColumnname1)+')/sum('+quotename(@vColumnname2)+') from '+quotename(@vtbname)+' where '+quotename(@vcolname)+' between '''+@vTime1+''' and '''+@vTime2+''''
--存储过程可以,使用类似下面的方法
declare @s nvarchar(4000)
select @s='select @re=('
+replace(replace(公式,'x',参数x),'y',参数y)
+') from table where calendar between '
+rtrim(开始时间)+' and '+rtrim(结束时间)
from 算法表
declare @re float
exec sp_executesql @s,N'@re out',@re out
select 结果=@re