SQL2005表中列公式计算

smh05128 2010-07-27 09:05:03
有两个表,一个用于存储数据,一个用于存储公式,如何根据这个两个表求出公式的结果。
例如:
表一:
FLAG VALUE1 VALUE2
A 2 3
B 3 5
C 5 6
D 4 8
表二:
FLAG EXPRESS
Loa A*B
NO #VALUE-VALUE1(其中#VALUE是代表各个列与第一列VALUE1相减,如VALUE1-VALUE1,VALUE2-VALUE1)
BWC Loa*D


需要得出:
FLAG VALUA1 VALUE2
Loa 6 15
NO 0 2
BWC 24 120



请问如何实现
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
华夏小卒 2010-07-27
  • 打赏
  • 举报
回复
--> 测试数据: [ta]
if object_id('[ta]') is not null drop table [ta]
go
create table [ta] (FLAG varchar(1),VALUE1 int,VALUE2 int)
insert into [ta]
select 'A',2,3 union all
select 'B',3,5 union all
select 'C',5,6 union all
select 'D',4,8
--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb] (FLAG varchar(3),EXPRESS varchar(17))
insert into [tb]
select 'Loa','A*B' union all
select 'NO','#VALUE-VALUE1' union all
select 'BWC','Loa*D' union all
select 'ABC','BWC*C' union all
select 'ND','ABC*BWC'
华夏小卒 2010-07-27
  • 打赏
  • 举报
回复
-- 辅助表
----------------------------------------------
if object_id('#T') is not null drop table #T
go
create table #T(FLAG varchar(3) ,value1 int,value2 int)


declare @id varchar(10),@s nvarchar(500),@S1 nVARCHAR(500) ,@Nn INT,@Nn1 INT

--游标
declare cur cursor for select flag,express from tb
open cur
fetch next from cur into @id, @s

while @@fetch_status=0
begin
SET @S1=@S
--------------新增07.27--------------
if charindex('#VALUE',@S)>0
BEGIN
SELECT @S='0'
SELECT @S1=LTRIM(VALUE2-VALUE1) FROM TA WHERE FlaG='B'
END
-------------------------------------
select @s1=replace(@s1,flag,value2) from #T
SELECT @s=replace(@s,flag,value1) from #T

select @s1=replace(@s1,flag,value2) from ta
SELECT @s=replace(@s,flag,value1) from ta

if charindex('IF(',@S)>0
BEGIN
SET @S= REPLACE(REPLACE(REPLACE(STUFF(@S,CHARINDEX(',',@S),1,' THEN '),'IF(','CASE WHEN '),',',' ELSE '),')','')+' END'
SET @S1= REPLACE(REPLACE(REPLACE(STUFF(@S1,CHARINDEX(',',@S1),1,' THEN '),'IF(','CASE WHEN '),',',' ELSE '),')','')+' END'
END

SELECT @S=N'SELECT @N='+@S,@S1='SELECT @n1='+@S1

--PRINT @S
--PRINT @S1

EXEC sp_executesql @S,N'@n int output',@nn output
EXEC sp_executesql @S1,N'@n1 int output',@nn1 output

insert into #t select @id,@nn,@nn1

fetch next from cur into @id, @s
end
close cur
deallocate cur

-- 结果
------------------------

SELECT * FROM #T

FLAG value1 value2
---- ----------- -----------
Loa 6 15
NO 0 2
BWC 24 120
ABC 120 720
ND 2880 86400

(5 行受影响)
smh05128 2010-07-27
  • 打赏
  • 举报
回复
NO 中的0和2 是当FLAG=B的时候的来的,3-3 和5-3,刚才少了个条件
s_111111 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 s_111111 的回复:]
引用 2 楼 js_szy 的回复:
在上次的基础上改下不就行了吗

NO 0 2

这个怎么来的?


個人理解是
FLAG VALUA1 VALUE2
NO 0 2
NO #VALUE-VALUE1(其中#VALUE是代表各个列与第一列VALUE1相减,如VALUE1-VALUE1,VALUE2-VALUE1)
VALUA1=2-2(第一個2為公式Loa記錄前面那個字段列A的VALUE1[VALUE1-VALUE1],後一個2為當前列的VALUE1)
VALUA2=5-3(第一個5為公式Loa記錄前面那個字段列B的VALUE2[VALUE2-VALUE1],後一個3為當前列的VALUE1)
[/Quote]
有點錯誤 sorry
s_111111 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 js_szy 的回复:]
在上次的基础上改下不就行了吗

NO 0 2

这个怎么来的?
[/Quote]
個人理解是
FLAG VALUA1 VALUE2
NO 0 2
NO #VALUE-VALUE1(其中#VALUE是代表各个列与第一列VALUE1相减,如VALUE1-VALUE1,VALUE2-VALUE1)
VALUA1=2-2(第一個2為公式Loa記錄前面那個字段列A的VALUE1[VALUE1-VALUE1],後一個2為當前列的VALUE1)
VALUA2=5-3(第一個5為公式Loa記錄前面那個字段列B的VALUE1[VALUE2-VALUE1],後一個3為當前列的VALUE1)
rmljoe 2010-07-27
  • 打赏
  • 举报
回复
表为什么要这样设计啊
华夏小卒 2010-07-27
  • 打赏
  • 举报
回复
在上次的基础上改下不就行了吗

NO 0 2

这个怎么来的?
黄_瓜 2010-07-27
  • 打赏
  • 举报
回复
表一的FLAG 和表二的FLAG 是怎么关联上的?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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