SQL Server里如何引用另一字段的值匹配再计算?

comcyd 2018-05-13 06:54:24
各路大神,帮忙看看,在线等
如下有个表A,先看一下表结构:目的是自动算出A04的值

A01(标识) A02 (数值) A03(公式) A04(公式值)
-------------------------------------------------------------------------------------------------
长A 500 (长A)-10
长B 600 (宽A)-10
宽A 700 (长B)-20
宽B 800 (宽A)-20
...

需求:
表中A03里的公式字段里都有可能从每一行的A01对应取值(值在A02里),引用值不一定是同一行,
是一个交叉匹配替换后再计算的过程,最终得到A04值的效果如下

A01(标识) A02 (数值) A03(公式) A04(公式值)
-------------------------------------------------------------------------------------------------
长A 500 (长A)-10 490
长B 600 (宽A)-10 690
宽A 700 (长B)-20 580
宽B 800 (宽A)-20 680
...
示意图:
...全文
1146 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
comcyd 2018-05-16
  • 打赏
  • 举报
回复
引用 1 楼 u013489937 的回复:
设testTable 为表明 update testTable set testTable.a04 =d.a04 from ( select b.a01 as ba01,a.a01 as aa01,(a.a02-convert(int,right(b.a03,LEN(b.a03)-charindex('-',b.a03)))) as a04 from testTable b left join testTable a on a.a01= SUBSTRING(b.a03,charindex('(',b.a03)+1,charindex(')',b.a03)-charindex('(',b.a03)-1) ) d where testTable.a01 = d.ba01
谢谢,达到效果了!厉害!
comcyd 2018-05-16
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([A01] nvarchar(22),[A02] int,[A03] nvarchar(27),[A04] int)
Insert #T
select N'长A',500,N'(长A)-10',0 union all
select N'长B',600,N'(宽A)-10',0 union all
select N'宽A',700,N'(长B)-20',0 union all
select N'宽B',800,N'(宽A)-20',0
Go
--测试数据结束
UPDATE #T
SET A04 =
    (
        SELECT TOP 1 A02 FROM #T a WHERE CHARINDEX('(' + a.A01 + ')', #T.A03) > 0
    ) + CONVERT(INT, SUBSTRING(A03, CHARINDEX(')', A03)+1, LEN(A03) - CHARINDEX(')', A03)));

SELECT * FROM #T
排版漂亮!问题解决了,堪称完美!谢谢!
二月十六 2018-05-15
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([A01] nvarchar(22),[A02] int,[A03] nvarchar(27),[A04] int)
Insert #T
select N'长A',500,N'(长A)-10',0 union all
select N'长B',600,N'(宽A)-10',0 union all
select N'宽A',700,N'(长B)-20',0 union all
select N'宽B',800,N'(宽A)-20',0
Go
--测试数据结束
UPDATE #T
SET A04 =
(
SELECT TOP 1 A02 FROM #T a WHERE CHARINDEX('(' + a.A01 + ')', #T.A03) > 0
) + CONVERT(INT, SUBSTRING(A03, CHARINDEX(')', A03)+1, LEN(A03) - CHARINDEX(')', A03)));

SELECT * FROM #T


不死恶魔 2018-05-15
  • 打赏
  • 举报
回复
设testTable 为表明 update testTable set testTable.a04 =d.a04 from ( select b.a01 as ba01,a.a01 as aa01,(a.a02-convert(int,right(b.a03,LEN(b.a03)-charindex('-',b.a03)))) as a04 from testTable b left join testTable a on a.a01= SUBSTRING(b.a03,charindex('(',b.a03)+1,charindex(')',b.a03)-charindex('(',b.a03)-1) ) d where testTable.a01 = d.ba01

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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