求指点:怎样实现根据传入的公式计算结果

shiguangxin 2014-11-17 01:52:11

数据库:sql2000 企业版

有一个用于保存统计结果的中间表
表结构如下:

机构编号 年份 月份 变量名 变量值
LN001 2014 10 S001 1680
LN001 2014 10 S002 788
LN001 2014 10 S003 999
HB001 2014 10 S001 4680
HB001 2014 10 S002 2555
HB001 2014 10 S003 7788
...... ...... ...... ...... ......

BJ002 2014 10 S501 78
BJ002 2014 10 S502 168
BJ002 2014 10 S503 900

要求根据传入的公式来计算结果

例如:
1 要查询 LN001 2013年10月的损益
2 要查询 LN001 2013全年的损益

公式为 S001+S002+S010*2-S078+(S092/2)+S188*0.5
说明:这个公式的长度不是固定的(超过500个变量)

我的考虑是把行转换成列这样一个select 就搞定
但是变量太多了,不知道会不会超过sql数据表的最大列数。另外就是行列转换会不会很慢影响效率? 因为这个操作是很频繁的。

如果不使用行列转换,有没有更好的解决办法?
如果只能使用行列转换,麻烦哪位能帮忙转换一下 啊啊

谢谢 谢谢
...全文
198 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiguangxin 2014-11-19
  • 打赏
  • 举报
回复
多谢 Tiger_Zhao
Tiger_Zhao 2014-11-18
  • 打赏
  • 举报
回复
DECLARE @exp varchar(max)
SET @exp = 'S001+S002+S010*2-S078+(S092/2)+S188*0.5'

;WITH table1(变量名,变量值) AS (
SELECT 变量名,变量值
FROM 中间表
WHERE 机构编号='LN001'
AND 年份=2013
AND 月份=10
)
SELECT @exp = REPLACE(@exp,变量名,Convert(varchar(11),变量值))
FROM table1

PRINT @exp
EXEC('SELECT '+@exp+' AS value')
shiguangxin 2014-11-18
  • 打赏
  • 举报
回复
而且公式有可能很长
shiguangxin 2014-11-18
  • 打赏
  • 举报
回复
关键是要根据公式来计算结果 S001+S002+S010*2-S078+(S092/2)+S188*0.5 比较头疼啊
舞台中央的我 2014-11-17
  • 打赏
  • 举报
回复
机构编号 年份 月份 变量名 变量值 LN001 2014 10 S001 1680 LN001 2014 10 S002 788 LN001 2014 10 S003 999 HB001 2014 10 S001 4680 HB001 2014 10 S002 2555 HB001 2014 10 S003 7788 ...... ...... ...... ...... ...... BJ002 2014 10 S501 78 BJ002 2014 10 S502 168 BJ002 2014 10 S503 900 要求根据传入的公式来计算结果 例如: 1 要查询 LN001 2013年10月的损益 2 要查询 LN001 2013全年的损益 把 这个数据放到表里 写 简单语句 select sum (变量值) from where 机构编号 = LN001 年份 = 2013 不行吗???
还在加载中灬 2014-11-17
  • 打赏
  • 举报
回复
行转列,速度肯定慢,如果你的公式没有其它地方很特殊的,用1#的就可以了,加些条件一下点缀下就很好了 至于全年求和,如果没有变量名间的乘除运算,则可以先合并成一年,再执行就可以了
xxfvba 2014-11-17
  • 打赏
  • 举报
回复
楼上的高人,学习了
Tiger_Zhao 2014-11-17
  • 打赏
  • 举报
回复
把变量名用变量值替换掉不就行了。
查询用机构编号筛选,全年再来个分组求和。
DECLARE @exp varchar(max)
SET @exp = 'S001+S002'

;WITH table1(变量名,变量值) AS (
SELECT 'S001',1680 UNION ALL
SELECT 'S002',788
)
SELECT @exp = REPLACE(@exp,变量名,Convert(varchar(11),变量值))
FROM table1

PRINT @exp
EXEC('SELECT '+@exp+' AS value')

1680+788
value
-----------
2468

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧