SQL Server 基于另一个表中数据的SQL计算字段

iqxoj9l9  于 2023-02-15  发布在  其他
关注(0)|答案(3)|浏览(125)

我有两个表,工程表和 Jmeter 表。在工程表中,我有以下列和可能的数据:

Tag                 |            Speed Control                       
PC-1234             |
ME-1235             |
BF-1236             |

在仪器表中,我有以下列和数据

Function         |        Tag   
SC               |        1234    
SC               |        1235    
SC               |        1237

我想自动执行“工程”表格中的“速度控制”列,以便在“ Jmeter ”表格中有一行数据的函数为SC且“标记”列具有与“工程”表格中“标记”列的数字部分匹配的数据时显示“是”或“否”。因此,结果如下所示:

Tag                 |            Speed Control                        
PC-1234             |             Yes    
ME-1235             |             Yes    
BF-1236             |             No

请用最好的方法帮助你。提前感谢你的帮助。

t40tm48m

t40tm48m1#

您不需要在Engineering表中为此设置单独的列,您只需要一个可以查询的视图

CREATE VIEW EngineeringSpeedControl
AS

SELECT
  e.Tag,
  SpeedControl = CASE WHEN i.Tag IS NULL THEN 'No' ELSE 'Yes' END
FROM dbo.Engineering e
LEFT JOIN dbo.Instrumentation i
    ON i.Tag = RIGHT(e.Tag, LEN(e.Tag) - 3)
   AND i.[Function] = 'SC';

不幸的是,由于表的设计很差,您需要对字符串进行一些操作。
理想情况下,您可以将Engineering.Tag列拆分为单独的部分,这样您就可以执行直接连接

LEFT JOIN dbo.Instrumentation i
    ON i.Tag = e.Tag
   AND i.[Function] = 'SC';
dojqjjoe

dojqjjoe2#

由于我不知道engineers中的Tag列是否总是相同的格式,因此我保留了查询,以便它可以具有类似的设计xxxxx-nnnnnnnn,中间带有减号。

UPDATE [dbo].[Engineering] 
SET [Speed Control] =
CASE WHEN EXISTS ( SELECT 1 FROM [dbo].[Instrumentation] i WHERE RIGHT([dbo].[Engineering] .[tag],CHARINDEX('-', (REVERSE([dbo].[Engineering] .[tag]))) - 1) = CAST(i.[Tag] AS VARCHAR(10))) then 'YES' ELSE 'NO' END
WHERE [Speed Control]  IS NULL

结果将是

xmakbtuz

xmakbtuz3#

创建函数并在计算列中使用函数

create table instrumentation([Function]  varchar(200) null,  Tag varchar(200) null)  

  insert into instrumentation values('SC', '1234'),('SC', '1235'),('SC', '1237')

 create Function fn_Speed (@tag varchar(200))
 returns varchar(200)
 as
begin

declare @tagg varchar(200)= (select SUBSTRING(@tag, charindex('-', @tag)+1,10))
declare @result varchar(200)
--return  @tagg

If exists (
select  1 from instrumentation where tag =@tagg)
    select @result= 'True' 
else 
    select @result= 'False' 
return @result
end

  Create table engineering (tag varchar(200), Speed   as dbo.fn_Speed (tag) )

  insert into engineering(tag)values('PC-1234'),  ('ME-1235'), ('BF-1236')

相关问题