在 SQL 服务器中计算表达式
Evaluate Expression in SQL server
我有一个SQLtable像下图
此处Basic
和HouseRent
列是varchar
类型。我想从 expression
计算 Basic
和 HouseRent
。 Gross
和 Medical
已经有了值。
我尝试了以下 SQL 但它显示
Invalid column name GrossSalary and Medical
Create table #Results (ID int,Value varchar(max))
Declare @SQL varchar(max)=''
Select @SQL = @SQL+concat(',(',PolicyId,',cast(',Basic,' as varchar(max)))')From ProllSalaryPolicy
Select @SQL = 'Insert Into #Results Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)'
如果我没理解错你想计算 Basic 和 HouseRent 列
如果公式没有改变,我建议再创建 2 个列:
第一个 BasicValue 和第二个 HouseRentValue
您可以使用此脚本填写这 2 列
更新你的桌子
设置 BasicValue = (GrossSalary - Medical) / Convert(Decimal(4,2),Right(basic,3))
set HouseRentValue = Basic * Convert(Decimal(4,2),Right( HouseRent,3))
试试这个:
create table ProllSalaryPolicy (
PolicyId int not null,
GrossSalary int,
Medical int,
Basic varchar(512),
HouseRent varchar(512)
)
insert into ProllSalaryPolicy values(1, 13100, 1450,'(GrossSalary-Medical)/1.5', 'Basic*0.4')
insert into ProllSalaryPolicy values(3, 13100, 1450,'(GrossSalary-Medical)/1.4', 'Basic*0.5')
Create table #Results (ID int,Value varchar(max))
Declare @SQL varchar(max)=''
Select @SQL = @SQL+' Insert Into #Results(Id, Value) Select '+cast(PolicyId as varchar(50))+', '+Replace(HouseRent,'Basic',Basic)+' FROM ProllSalaryPolicy where PolicyId = '+cast(PolicyId as varchar(50)) from ProllSalaryPolicy
exec (@sql)
select * from #Results
drop table #Results
drop table ProllSalaryPolicy
你可能想尝试这样 (tested in SQL 2017 fiddle):
Create table prollSalaryPolicy
(ID int,
GrossSalary float,
Medical float,
BasicExpression varchar(1000)
);
Create table #Results (ID int,Value varchar(max));
Insert into prollSalaryPolicy (id, GrossSalary, Medical, BasicExpression)
values
(1, 13000,1400,'(GrossSalary-Medical)/1.5')
Declare @SQL varchar(max)='';
Select @SQL = @SQL + CONCAT (cast(id as varchar(3)),', ', BasicExpression) from prollSalaryPolicy;
Print @SQL;
select @SQL = 'Insert into #Results (ID, Value) select ' + @SQL + ' from prollSalaryPolicy'
Print @SQL;
exec (@SQL);
请尝试以下查询
Create Table #Sal (PolicyId varchar(10),GrossSalary float,Medical Float,Basic Varchar(1000),HouseRent varchar(100))
insert into #Sal
Values(1,13300,1450,'(GrossSalary-Medical)/1.5','Basic*0.4')
,(3,13100,1450,'(GrossSalary-Medical)/1.4','Basic*0.5')
select * from #Sal
Declare @Qry nvarchar(max)='select t1.PolicyId,sum(t1.GrossSalary),Sum(t1.Medical)
,Sum((t1.GrossSalary-t1.Medical)/1.5) from #Sal t1
Group by t1.PolicyId'
Exec sp_executeSql @Qry
我有一个SQLtable像下图
此处Basic
和HouseRent
列是varchar
类型。我想从 expression
计算 Basic
和 HouseRent
。 Gross
和 Medical
已经有了值。
我尝试了以下 SQL 但它显示
Invalid column name GrossSalary and Medical
Create table #Results (ID int,Value varchar(max))
Declare @SQL varchar(max)=''
Select @SQL = @SQL+concat(',(',PolicyId,',cast(',Basic,' as varchar(max)))')From ProllSalaryPolicy
Select @SQL = 'Insert Into #Results Select * From ('+Stuff(@SQL,1,1,'values')+') N(ID,Value)'
如果我没理解错你想计算 Basic 和 HouseRent 列
如果公式没有改变,我建议再创建 2 个列: 第一个 BasicValue 和第二个 HouseRentValue
您可以使用此脚本填写这 2 列
更新你的桌子 设置 BasicValue = (GrossSalary - Medical) / Convert(Decimal(4,2),Right(basic,3)) set HouseRentValue = Basic * Convert(Decimal(4,2),Right( HouseRent,3))
试试这个:
create table ProllSalaryPolicy (
PolicyId int not null,
GrossSalary int,
Medical int,
Basic varchar(512),
HouseRent varchar(512)
)
insert into ProllSalaryPolicy values(1, 13100, 1450,'(GrossSalary-Medical)/1.5', 'Basic*0.4')
insert into ProllSalaryPolicy values(3, 13100, 1450,'(GrossSalary-Medical)/1.4', 'Basic*0.5')
Create table #Results (ID int,Value varchar(max))
Declare @SQL varchar(max)=''
Select @SQL = @SQL+' Insert Into #Results(Id, Value) Select '+cast(PolicyId as varchar(50))+', '+Replace(HouseRent,'Basic',Basic)+' FROM ProllSalaryPolicy where PolicyId = '+cast(PolicyId as varchar(50)) from ProllSalaryPolicy
exec (@sql)
select * from #Results
drop table #Results
drop table ProllSalaryPolicy
你可能想尝试这样 (tested in SQL 2017 fiddle):
Create table prollSalaryPolicy
(ID int,
GrossSalary float,
Medical float,
BasicExpression varchar(1000)
);
Create table #Results (ID int,Value varchar(max));
Insert into prollSalaryPolicy (id, GrossSalary, Medical, BasicExpression)
values
(1, 13000,1400,'(GrossSalary-Medical)/1.5')
Declare @SQL varchar(max)='';
Select @SQL = @SQL + CONCAT (cast(id as varchar(3)),', ', BasicExpression) from prollSalaryPolicy;
Print @SQL;
select @SQL = 'Insert into #Results (ID, Value) select ' + @SQL + ' from prollSalaryPolicy'
Print @SQL;
exec (@SQL);
请尝试以下查询
Create Table #Sal (PolicyId varchar(10),GrossSalary float,Medical Float,Basic Varchar(1000),HouseRent varchar(100))
insert into #Sal
Values(1,13300,1450,'(GrossSalary-Medical)/1.5','Basic*0.4')
,(3,13100,1450,'(GrossSalary-Medical)/1.4','Basic*0.5')
select * from #Sal
Declare @Qry nvarchar(max)='select t1.PolicyId,sum(t1.GrossSalary),Sum(t1.Medical)
,Sum((t1.GrossSalary-t1.Medical)/1.5) from #Sal t1
Group by t1.PolicyId'
Exec sp_executeSql @Qry