数据库: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数据表的最大列数。另外就是行列转换会不会很慢影响效率? 因为这个操作是很频繁的。
如果不使用行列转换,有没有更好的解决办法?
如果只能使用行列转换,麻烦哪位能帮忙转换一下 啊啊
谢谢 谢谢
------解决思路----------------------
把变量名用变量值替换掉不就行了。
查询用机构编号筛选,全年再来个分组求和。
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
------解决思路----------------------
行转列,速度肯定慢,如果你的公式没有其它地方很特殊的,用1#的就可以了,加些条件一下点缀下就很好了
至于全年求和,如果没有变量名间的乘除运算,则可以先合并成一年,再执行就可以了
------解决思路----------------------
机构编号 年份 月份 变量名 变量值
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
不行吗???
------解决思路----------------------
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')